http://blog.manbolo.com/2012/11/20/using-xcode-opengl-es-frame-capture 这里是原文,因为它版本比较老和它demo的限制,所以也想写一个基于Xcode6上基于3d渲染的分析的教程

Xcode和Visual Studio的一个主要差别,还是再Xcode有一套免费的的性能工具,例如Instruments,不过对于图形程序员来说,Xcode最强大的功能还是可以捕获和分析OpenGL ES和最新Metal framewrok的Frame。这个工具叫GPU Frame Capture(Xcode6.x),可以查看OpenGL和Metal的缓冲,以及GLES Shader和Metal shader。这里也是一个如何再你的App上运用它的快速教程。

教程里的例子和代码来源于UE4的Sun Temple 工程和Apple开发者网站上的MetalDeferredLighting工程

https://developer.apple.com/library/ios/samplecode/MetalDeferredLighting/Introduction/Intro.html

1 设置 GPU Frame Capture

这里是Apple开发文档上关于GPU Frame Capture的简介,

https://developer.apple.com/library/ios/documentation/ToolsLanguages/Conceptual/Xcode_Overview/chapters/about.html 如果要使用这个功能,至少要是Xcode4.5以上(Metal的话必须是Xcode6.x),而且必须是在真机上,并连接运行Xcode的Mac,如果渲染api是metal frame的话,必须是ios8的系统,iphone5s,ipad air,级别的设备上。

另外需要把GLKit或OpenGL Framework加入到代码里,然后在菜单选择Product > Manage Schemes,双击你的app的Scheme,然后进入编辑

点击Run这个scheme,然后在Options的标签上设置GPU Frame Capture,默认打开是Automatically Enabled,不过因为GLES和Metal同时存在的缘故,建议强制设置为OpenGL ES或Metal(例如基于UE4的app)。

2 捕获 Frame

然后你就可以捕获你要调试的app的Frame了,在Debug模式下运行App (Product > Run or ⌘R),当你的app在真机上完全加载后,就可以进入 Debug Navigator  (View > Navigators > Show Debug Navigator,或直接点击左侧代码栏上的小图标),再点击Debug Navigator上的FPS标签

例如下图,你可以看到你的App的更新的FPS显示,以及左侧不同的测试项目,而程序员的目标就是让它达到60FPS,而我们的Sun Temple这个时候只有26FPS左右,需要我们找到性能的瓶颈

在编辑器里,我们可以看到CPU和GPU的消耗时间毫秒数,如果想要达到60 FPS,那么CPU和GPU时间应该只有16毫秒,30FPS的话是32毫秒,而这里例子里,CPU消耗38有些超过限制了。

从这里可以看出,我们的主要瓶颈不在GPU上,而是在我们的代码调用上,为了获得更好的信息,我们可以捕获一个gputrace,来查看每帧渲染内部的具体流程,我们在Debug的输出窗口上,点击照相机图标获取整个Frame。

点击Capture Frame图标后(根据程序的大小捕获需要等几~十几秒),你就可以在Debug Navigator里访问OpenGL或Metal的Frame了

而在移动设备上,你可以看到程序显示的事当前捕获的那帧,并暂停了,在Debug Navigator上,如果你把不同的图标展开,也可以看到捕获Frame内部的OpenGL/Metal调用,Debug Navigator会把与这帧(包括你的代码调用栈)关联的每一个Draw Call和State Call都显示在编辑器面板上,而State的信息,也会显示在下方的Debug面板上。

如果你没有看到Object面板的话(蓝框部分),可以点击show assistant Editor,然后选择想显示的类型,如果Mac设备不是太好,而游戏又是类似UE4这种大型图形程序,选择All需要慎重。

你可以通过在整个buffer面板上右键选择Show/Hide Draw Call Highlight,把当前draw call绘制的三角面用亮绿色高亮出来。

3 查看OpenGL/Metal的对象

在assistant编辑窗口,你可以访问OpenGL对象,例如Buffer,VAO,以及绑定或未绑定的Texture,还有shader programes:

可以查看Array Buffer里的内容

点击Shader,会显示对应的shader源代码

这样就可以很简单的获得所有的shader代码了

4 性能的改善

为了方便考虑,这里使用的之前u3d上一个IBL的优化案例,Cpature GPU Frame后,从图中可以看到,这个app的瓶颈主要在GPU上的某个shader

那么我们需要对这个shader做优化,在这个program上双击,可以在辅助编辑器窗口看到shader代码(可惜的是,UE4和Unity3d的shader都是用glsl-optimizer优化过的,可读性并不是那么高了)

这里的textureLod是有些消耗的,第3项lod值是用来索引CubeMap的mip,来实现IBL材质的粗糙效果,这个我们把它改为1.0

点击左下角的刷新图标。然后就可以看到修改后的效果,下图中,蓝色的修改前的情况,绿色是当前的情况,修改为1.0后效率提高的原因,是如果一开始lod是定值的话,texture就再shader运行前pre fetch,就需要再每个像素的pixelshader里重复加载这个cubemap里,从而起到了优化的作用

然后,你可以回到Unity或UE4里,对shader源代码再做一次修改,就起到了优化的作用了

5 保存和分享捕获的Frame

最后,你可以导出和保存你捕获的GPU Frame,不需要源代码,就可以把它分享给其他人,例如一个可以电话帮你解决的OpenGL或Metal的专家

只是这种保存方式比较尴尬,目前还没有更好的方式来保存,特别是在Xcode6.x版里。首先在菜单里选择Navigator>Open in..

点击左侧的+的符号,然后给UE4Game.gputrace创建一个新的窗口

在新创建的窗口的(*.gputrace)的文字上右键 

你可以看到上图第2个com.apple.dt.xxxxx里保存的就是.gputrace临时保存的位置了,你可以把它保存到你的其他目录下,如果你想重新打开或分享给其他人,只需要连接移动设备到你的Mac,并双击这个*.gputrace,然后可以在编辑器里看到下图的对话框:

点击Replay Trace,然后就会进入这个文件的保存的Frame模式里,非常方便

下篇应该就是UE4 SunTemple的教程了

使用Xcode GPU Frame Caputre教程的更多相关文章

  1. XCode中使用SVN 教程

    修改subversion.config方法: 可以直接在终端上输入:vi ~/.subversion/config来编辑. 也可以通过Finder搜索.subversion,点击下边的+号,进入高级搜 ...

  2. Google Colab 免费GPU服务器使用教程 挂载云端硬盘

    一.前言二.Google Colab特征三.开始使用3.1在谷歌云盘上创建文件夹3.2创建Colaboratory3.3创建完成四.设置GPU运行五.运行.py文件5.1安装必要库5.2 挂载云端硬盘 ...

  3. Google Colab 免费GPU服务器使用教程

    Google免费GPU使用教程(亲测可用)   今天突然看到一篇推文,里面讲解了如何薅资本主义羊毛,即如何免费使用Google免费提供的GPU使用权. 可以免费使用的方式就是通过Google Cola ...

  4. 【神经网络与深度学习】caffe+VS2013+Windows无GPU快速配置教程

    首先来一波地址: happynear大神的第三方caffe:http://blog.csdn.net/happynear/article/details/45372231 Neil Z大神的第三方ca ...

  5. Xcode如何集成Pod教程

    一般开发都会用到很多第三方的框架,利用好他们可以加快开发进度,为了更方便将第三方的框架集成到我们的项目中,Pod是个很好的选择,现在说一下该怎么将Pod集成到我们的Xcode中 第一种方法 命令行的方 ...

  6. Xcode打印frame id

    开启 打开终端输入三条命令: . touch ~/.lldbinit . echo display @import UIKit >> ~/.lldbinit . echo target s ...

  7. Xcode修改项目名称教程

    http://wenku.baidu.com/view/4e939b1cf61fb7360a4c653b

  8. Xcode OpenGL ES Frame Capture的使用

    一.使用背景 近期在Xcode中使用OpenGL ES 2.0实现一些效果,刚开始存在一些性能问题(CPU和GPU),幸运的是Xcode中自带了免费的性能工具Instruments,其中包含OpenG ...

  9. Xcode和github入门详细教程

    Xcode和github详细教程! 主要是参考了现在网上的一些资料给没整过的人一个详细的指南. (1)先在github上注册账号,自行解决! (2)在导航栏右上角new一个repository(仓库) ...

随机推荐

  1. php 增删改查练习

    添加界面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  2. gitlab安装

    [root@localhost ~]# wget https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rp ...

  3. Java查询网址

    Java在线帮助文档: http://docs.oracle.com/javase/8/docs/technotes/guides/desc_jdk_structure.html Java小知识讲解: ...

  4. Storm工程创建

    1.创建maven项目: pom.xml: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&quo ...

  5. C++的那些事:面向对象

    1 OOP概述 面向对象基于三个基本概念:数据抽象.继承和动态绑定.通过使用数据抽象,我们可以将类的接口与实现分离:使用继承,可以定义相似的类型并对其相似关系建模:使用动态绑定,可以在一定程度上忽略相 ...

  6. Effective C++笔记:资源管理

    资源:动态分配的内存.文件描述器.互斥锁.图形界面中的字型与笔刷.数据库连接以及网络sockets等,无论哪一种资源,重要的是,当你不再使用它时,必须将它还给系统. 条款13:以对象管理资源 当我们向 ...

  7. Apache服务器的下载与安装

    关于PHP的运行环境搭载,网上文章繁杂,遂自己整理一篇! PHP的运行必然少不了服务器的支持,何为服务器?通俗讲就是在一台计算机上,安装个服务器软件,这台计算机便可以称之为服务器,服务器软件和计算机本 ...

  8. 垂直的SeekBar:VerticalSeekBar

    public class VerticalSeekBar extends AbsSeekBar { private Drawable mThumb; public interface OnSeekBa ...

  9. node相关--WebSocket

    socket:socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信. ajax: 通过HTTP请求+响应模式的方式来发送和 ...

  10. 安卓智能手持POS打印票据 扫描盘点移动开单软件/无线开单系统/PDA移动开单软件

    移动开单手持机,它通过WIFI或者GPRS连接并访问电脑数据,实现移动扫描开单,数据同步上传等功能.方便.实用,大大提高工作效率!安卓智能手持POS是一套适合大酒店.咖啡馆..洗衣店.按摩洗浴,商场等 ...