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. mysql 超级管理员

    mysql> grant all privileges on *.* to 'master'@'%' identified by '3306' with grant option; Query ...

  2. ubuntu下安装kde Plasma

    Ubuntu15.04安装KDE Plasma 5.3桌面环境_百度经验 http://jingyan.baidu.com/article/bad08e1ee280e709c8512185.html ...

  3. GDUT 校赛02 dp回文串

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABSkAAAIhCAIAAAAtmainAAAgAElEQVR4nOzdfaxkd33n+ZJacstqa3 ...

  4. Synergy

    Synergy 可以在多台电脑之间共享鼠标.键盘.剪贴板.Synergy是一套开源共享软件,完美跨 Win.Linux.Mac运行.真正做到使用一套键盘和鼠标就可控制多个电脑. 下载地址:http:/ ...

  5. 从源码编译Chrome(chromium)

    转自:http://www.udpwork.com/item/13827.html 官网描述 http://www.chromium.org/developers/how-tos/build-inst ...

  6. Android Studio 导入外部lib文件

    Android Studio 导入外部lib文件   1.将jar包放入Module里的lib文件夹中.(自己创建lib文件夹) 2.在project选中jar包点击右键"Add as li ...

  7. libyuv 编译 for android

    libyuv is an open source project that includes is an instrumentation framework for building dynamic ...

  8. 哈希表--HashSet<T>

    .Net3.5之后出现了HashSet<T>,硬翻译过来就是“哈希集合”,跟“哈希”两字挂钩说明这种集合的内部实现用到了哈希算法,用Reflector工具就可以发现,HashSet< ...

  9. TODO:Half Half的设计

    IMessageHandler :消息同步处理接口 AbsQueue:消息队列处理层,可以使用Template Method进行设计 INetWorkLayer:专门处理网络IO的,并附带多线程与异步 ...

  10. LightOJ1326 Race(DP)

    题目问N匹马比赛有多少种结果.一开始想用排列组合搞搞,然后发现想错了.艰难地把思路转向DP,最后AC了. dp[i][j]表示前i匹马确定出j个名次的方案数 dp[1][1]=1 对于第i匹马,它要确 ...