glInsertEventMarkerEXT(0, "com.apple.GPUTools.event.debug-frame")
当OpenGL ES客户端到达此标记时,它完成渲染帧,然后Xcode自动捕获用于渲染该帧的整个命令序列。
Xcode捕获帧后,会显示OpenGL ES Frame Debugger
界面。 使用此界面来检查渲染帧的OpenGL ES命令的顺序,并检查OpenGL ES资源,参见Touring the OpenGL ES Frame Debugger。
此外,Xcode可以对应用程序的OpenGL ES使用情况进行自动分析,以确定渲染器和着色器架构的哪些部分可以从性能优化中获益最多。 要使用此选项,请单击GPU报告顶部的分析按钮(如Figure B-1右上方所示)。
当您单击“分析”按钮时,Xcode将捕获一个框架(如果尚未被捕获),则通过使用附加的iOS设备进行一系列实验来运行渲染代码。 例如,要查看渲染速度是否受到纹理大小的限制,Xcode将运行OpenGL ES命令的捕获序列,同时将您的应用程序提交到GPU的纹理数据和大小减小的纹理集合。 在Xcode完成分析之后,GPU报告的Problems & Solutions
领域列出了所发现的任何问题,并提出可能的性能改进建议。
Touring the OpenGL ES Frame Debugger - 浏览OpenGL ES帧调试器
Xcode捕获帧后,会自动重新配置OpenGL ES调试界面。 OpenGL ES Frame Debugger
界面修改了Xcode工作区窗口的几个区域,以提供有关OpenGL ES渲染过程的信息,如图B-3
和图B-4
所示,并在下面进行了总结。 (框架调试器不使用检查器或库工作板,因此您可能希望在OpenGL ES调试期间隐藏Xcode的实用程序区域。)
Figure B-4 Frame debugger examining shader program performance and analysis results
1. Navigator Area - 导航区域
在OpenGL ES帧调试器界面中,调试导航器由OpenGL ES帧导航器替代。 该导航仪显示OpenGL ES命令,可以渲染捕获的帧,按顺序或根据其相关的着色器程序进行组织。 使用框架导航器顶部的Frame View Options
弹出菜单在视图样式之间切换。
View Frame By Call - 按调用查看帧
当您要依次研究OpenGL ES命令以查明错误,诊断呈现问题或识别常见性能问题时,通过调用查看捕获的帧。 在此模式下,框架导航器按照您的应用程序所称的顺序列出命令。 导致OpenGL ES错误或可能指示性能问题的命令旁边出现错误或警告图标。
您可以通过使用glPushGroupMarkerEXT
和glPopGroupMarkerEXT
函数为OpenGL ES命令组添加结构来添加结构,这些组显示为可以展开或折叠以显示更多或更少细节的文件夹。 (有关详细信息,请参阅 Annotate Your OpenGL ES Code for Informative Debugging and Profiling),您还可以展开OpenGL ES命令,以显示堆栈跟踪,指示应用程序代码中发出命令的位置。
使用上下文菜单来选择是否缩写命令名称以及要显示的命令,组和警告。 使用导航器底部的标志图标在显示所有OpenGL ES命令之间切换,并仅显示绘制到帧缓冲区中的那些。
单击OpenGL ES命令列表将导航到OpenGL ES命令序列中的那一点,影响帧调试器接口其他区域的内容,如下所述,并显示OpenGL ES调用的效果并附加设备的显示。
View Frame By Program - 按程序查看帧
当您要分析在每个着色器程序上花费的GPU时间和绘制命令时,可以通过程序查看捕获的帧。
展开程序的列表,以查看每个着色器在程序和每个绘图调用中的时间贡献。 展开一个绘图调用的列表,以显示一个堆栈跟踪,指示您的应用程序代码中发出该命令的位置。
使用上下文菜单来优化显示 - 您可以选择程序是按照其时间贡献进行排序的,以及时间信息是否以总渲染时间的百分比显示。
单击程序或着色器将在主编辑器中显示相应的GLSL源代码。 单击OpenGL ES命令将导航到帧捕获序列中的那一点。
注意:按程序查看帧选项仅在支持OpenGL ES 3.0
的设备上进行调试时可用(无论您的应用程序是否使用OpenGL ES 3.0或2.0上下文)。 在其他设备上,框架视图选项弹出菜单被禁用。
2. Editor Area - 编辑区
使用帧捕获时,您可以使用主编辑器预览要渲染的帧缓冲区,还可以使用助手编辑器来检查OpenGL ES资源并编辑GLSL着色器程序。 默认情况下,助理编辑器显示OpenGL ES上下文所有资源的图形概述,如图Figure B-3.所示。 使用助理编辑器的跳转栏仅显示为框架导航器中选择的调用使用的资源,或者选择一个单独的资源进行进一步检查。 您也可以双击概述中的资源进行检查。 当您选择资源时,助理编辑器将更改为适合该资源类型的任务的格式。
Previewing Framebuffer Contents - 预览Framebuffer内容
主编辑器显示由帧导航器中当前选择的绘图调用渲染的帧缓冲区的内容。 (如果帧导航器中所选的OpenGL ES命令不是绘图命令,例如,设置诸如glUseProgram
之类的状态的命令,则framebuffer会反映在选择之前由最近的绘图调用完成的渲染。)您也可以 使用主编辑器顶部的跳转条导航OpenGL ES命令的序列。
Figure B-7 Framebuffer settings popover
每个帧缓冲附件预览还显示一个绿色线框,突出显示当前绘图调用的效果(如图 Figure B-3所示)。 使用预览图像中的上下文菜单来选择是否突出显示在预览中或显示连接的设备上。
Editing Shader Programs - 编辑着色器程序
当您在助手编辑器的跳转栏或资源概述中选择着色程序时,助手编辑器将显示该程序片段着色器的GLSL源代码(如图B-8
所示)。 当您在框架导航器中选择一个程序(请参阅View Frame By Program)时,主编辑器显示程序的片段着色器,助手编辑器显示其顶点着色器。 在显示片段着色器的任何编辑器中,您可以使用跳转条切换到其对应的顶点着色器,反之亦然。
Figure B-8 GLSL shader source editor with update button
着色器源代码的每一行在右边距中突出显示,表示其对渲染时间的相对贡献。 使用这些来集中您的着色器优化工作 - 如果几行占用更多的渲染时间,可以查看更快的替代方案。 (有关着色器性能提示,请参阅Best Practices for Shaders。)
您可以在编辑器中更改着色器源代码。 然后,单击编辑器下方的更新按钮(如图Figure B-8所示)重新编译着色器程序,并查看其对捕获帧的影响。 如果编译着色器会导致GLSL编译器发生错误或警告消息,则Xcode会为每个问题注释着色器源代码。 重新编译的着色器程序在设备上仍然使用,因此您可以恢复运行应用程序。 单击调试栏中的继续按钮以查看您的着色器更改的操作。
Inspecting Vertex Data - 检查顶点数据
当您检查数组缓冲区时,助理编辑器显示缓冲区的内容(参见图B-9
)。 因为OpenGL ES内存中的缓冲区没有定义的格式,您可以使用编辑器底部的弹出菜单来选择其内容的显示方式(例如,32位整数或浮点值,或两倍于 许多16位整数或半浮点值)以及Xcode用于显示数据的列数。
Figure B-10 Assistant editor previewing vertex array object
Viewing Textures or Renderbuffers - 查看纹理或帧缓冲区
当您检查纹理或渲染缓冲区时,助理编辑器将显示其内容的图像预览。 您可以使用主编辑器中找到的相同控件来获取有关纹理对象或渲染缓冲区的更多信息,并调整图像预览。 对于纹理,您可以使用助手编辑器左下角的附加控件预览多维数据集地图纹理的每个面的纹理和(如果适用)的每个mipmap
级别(如图B-11
所示)。
Figure B-12 OpenGL ES debug bar
框架调试器没有调试控制台。 相反,Xcode提供了多个变量视图,每个视图都提供了OpenGL ES渲染过程当前状态的不同摘要。 使用弹出菜单在可用变量视图之间进行选择,在以下部分中讨论。
The All GL Objects View - 所有GL对象视图
所有GL对象视图与图B-13
右侧所示的“绑定GL对象”视图类似,列出了与辅助编辑器中图形概述相同的OpenGL ES资源。 然而,与图形概述不同,当您扩展其显示三角形时,此视图可以提供有关资源的更详细信息。 例如,扩展帧缓冲区或缓冲区对象的列表显示仅通过OpenGL ES查询功能(如glGetBufferParameter
和glGetFramebufferAttachmentParameter
)可用的信息。 扩展着色器程序的列表显示其状态,属性绑定和每个统一变量的当前绑定值。
The Bound GL Objects View - 绑定GL对象视图
图B-13
右侧所示的“绑定GL对象”视图的行为与All GL Objects view
视图相同,但仅列出当前要绑定的资源,用于框架导航器中所选的OpenGL ES命令。
Figure B-13 Debug area with GL Context and Bound GL Objects views
The GL Context View - GL上下文视图
图B-13
左侧的GL上下文视图列出了OpenGL ES渲染器的整个状态向量,并将其组织成功能组。 当您在更改OpenGL ES状态的框架导航器中选择一个调用时,更改的值将突出显示。 例如,调用glCullFace
或glFrontFace
函数会更改并突出显示状态列表的“剔除”部分中的值。 使用glEnable(GL_BLEND)
调用或使用glBlendFunc
函数更改混合参数来启用混合,可以在状态列表的“混合”部分中更改和突出显示值。
The Context Info View - 上下文信息视图
图B-14
右侧所示的The Context Info View
列出了有关正在使用的OpenGL ES渲染器的静态信息:名称,版本,功能,扩展名和类似数据。 您可以查看此数据,而不是编写自己的代码来查询渲染器属性,如GL_MAX_TEXTURE_IMAGE_UNITS
和GL_EXTENSIONS
。
图B-14
左侧所示的自动视图会自动列出在其他变量视图中通常找到的项目的子集以及适用于框架导航器中所选调用的其他信息。 例如:
如果所选的调用导致OpenGL ES错误,或者Xcode已经确定了所选调用的可能的性能问题,则该视图列出了每个的错误或警告和建议的修复。
如果所选调用更改OpenGL ES上下文状态的一部分,或者其行为取决于上下文状态,则视图会自动从GL Context view
中列出相关项。
如果所选择的调用绑定资源或使用诸如顶点数组对象,程序或纹理的绑定资源,则视图会自动列出“绑定GL对象”视图中的相关项目。
如果选择了绘图调用,则视图列出了程序性能信息,包括在绘制调用期间在每个着色器中花费的总时间,如果你自捕获帧以来已更改并重新编译着色器,则在每一个着色器中花费的基线时间都是不同的。 (仅在支持OpenGL ES 3.0的设备上进行调试时,程序性能信息才可用)。
此外,此视图列出了有关帧渲染性能的汇总统计信息,包括绘制数量和帧速率。
有点小困,睡了,未完,待续~~~