(映维网 2019年12月11日)Oculus开发者关系团队的其中一个主要任务是帮助开发者优化游戏,令其能够有效地支持所有的Oculus硬件。日前,所述团队中的开发者关系工程师克里斯蒂亚诺·费雷拉(Cristiano Ferreira)曾为数款Quest首发内容提供了帮助。日前,他撰文介绍了如何通过RenderDoc来优化你的Quest应用,包括如何轻松将其集成至你的工作流程,相关的基础知识,以及允许你在未来利用这项有用工具的技巧经验。下面是映维网的具体整理:
RenderDoc是一项用于窥视应用渲染机制幕后情况,从而确定事情是否按预期进行的优秀工具。对于商用游戏引擎,实际的渲染代码要么是隐藏,要么难以通过于各种内置子系统来解密。如果能够看到引擎是如何确定场景在单帧中的渲染方式,何乐而不为呢?欢迎使用RenderDoc。
当你通过RenderDoc捕获一帧时,它会按照帧的发出顺序记录所有图形API命令和资源,然后再播放它们,这样你就可以判断事情是否按照预期进行。RenderDoc同时可以帮助你大致了解GPU执行绘制需要多少时间和绘制逻辑组(由调试标记表示)。由于基于图块的渲染的性质,数字本身并非100%精确,但彼此之间足够准确。换句话说,你看到的不是“这个绘制调用花费了1.34毫秒”,而是能够查看所有绘制,并发现覆盖类似像素量的1.34毫秒绘制要久于0.2毫秒绘制,然后再确定用于生成所述绘制的asset和管道状态是否足够优化。
关于RenderDoc的另一个关键要点是,它完全免费,并且开源。你应始终使用最新的公共稳定版,从而确保工具纳入了所有的新功能,错误修复和性能优化。具体请访问官方的RenderDoc下载页面,并选择适用于你所选择平台的副本。
注:本文将随时间推移而动态地增删补充。
1. 开始使用RenderDoc
我们先来快速过一遍首次打开RenderDoc后的基本窗口项目。在棋盘格主窗口的上方,你会看到一系列的标签。以下是每个项目的简要概述:
Timeline(时间线):能够直观地显示不同阶段(不透明,透明,天空盒,early-z,阴影通道等)所花费的时间。它同时会显示渲染目标的读/写,所以你可以快速查看生成帧的方式是否会产生成本昂贵的解析成本。
Event Browser(实践浏览器):列出帧的所有API调用,并且用调试标记标签分开逻辑绘制组。在这里选择绘制会根据情景填充/更新所有其他选项卡(纹理查看器和网格查看器等).RenderDoc tabbed functionality
Texture Viewer(纹理查看器):显示所选绘制的输入纹理和输出纹理(RT)。单击单个纹理可以查看其格式/分辨率/可用的MIPS/MSAA级别等。
Pipeline State(管道状态):选择任何管道状态以查看绑定资源的所有属性和材质属性(透明度/混合状态和纹理/采样器等)。
Mesh Viewer(网格查看器):在本地空间查看输入网格,从而确定正在进行绘制的是哪个绘制。你同时可以看到顶点数目(对于验证LOD系统非常有用),屏幕空间中的后投影视图和顶点属性等。
Launch Application(启动应用):选择要运行并附加到RenderDoc host的应用程序。如果你选择的情景是“Local”,则可以在计算机执行应用程序。如果选择的情景是“Remote:Oculus Quest”,你将获得设备可用包的列表。
Resource Inspector(资源检查器):显示渲染目标,临时缓冲区,纹理,着色器和网格等所有GPU相关资源的列表。
Statistics(统计数据):显示你的绘制次数和GPU内存使用情况等。
2. 将RenderDoc附接到Oculus Quest
在命令提示符中运行adb devices命令时,请确保其枚举。第一次通过USB数据线连接Oculus Quest时,头显内会提示你允许从主机访问。为了确保稳定性,我建议使用USB 2.0 A到USB-C或专用的Oculus Link数据线。如果你看到设备,则设备应该在RenderDoc窗口左下角的情景菜单中可用。从列表中选择Oculus Quest,等待几秒钟,系统将会RenderDoc捕获层APK传输到设备,并让客户端连接到远程情景的服务器。
3. 启动并将RenderDoc附接到你的游戏/应用
要启动应用程序,请转到正确的选项卡“Launch Application”,然后单击“Executable Path”旁边的小图标。这将打开一个文件浏览器,而你在其中可以看到可执行文件,或者如果是Oculus Quest,它将显示设备所有可用的APK。如果你在本地(PC),你同时可以设置工作目录(如果它与默认目录不同)。
单击右侧的“Launch”按钮以启动附接RenderDoc的应用程序。(注意:需要是项目的Development Build才能进行附加)。
4. 捕获一帧
要进行帧捕获,只需点击“Capture Frame(s) Immediately”按钮。然后,RenderDoc将拦截针对图形情景的所有调用和asset等,并将它们保存在.rdc文件中。提示,如果出现问题,请遮住面罩附近的接近传感器。有时,我会贴上一条胶带,这样我在进行分析和优化时可以继续使用设备。如果在接近传感器检测到头显处于关闭状态时进行帧捕获,这将会导致生成空帧。你生成的文件将显示在“Captures collecte”部分。如果退出RenderDoc,我总是习惯将捕获的内容保存到桌面,这样可以方便以后重新加载。如果是使用Oculus Quest时捕获,则.rdc文件需要传输到主机PC,这可能需要更长的时间。
注意:如果你正在为Oculus Quest开发内容,并且在捕获时应用程序崩溃,这通常意味着系统内存已用完(可以查看RenderDoc日志,从而确保问题所在)。当在设备上进行RenderDoc捕获,必须保证足够的可用内存来支持应用的内存需求,renderdoc捕获层的内存需求,以及保存生成的.rdc文件所需的内存。下面是减少游戏内存占用量以进行捕获的技巧:
将版本设置成最低的纹理分辨率:Unity提供一个全局选项,可使八分之一纹理大小并启用纹理流式传输
在优化阶段,移除场景的额外加载以代替完全卸载和完全加载。
尽可能移除所有音频。
5. 调查你的捕获
获取概述:我通常会首先打开“Statistics”选项卡以查看我发出了多少绘制调用。这同时会告诉我正在使用的GPU内存量,并且提供一个直观的细分。
可视化绘制/时间:接下来,打开“Texture Viewer”选项卡,打开“Overlay”菜单中的“Highlight Draw Call”选项,单击“Gather Timings (clock)”按钮,最后在“Output”纹理部分中选择“Render Target”。这样做会为我提供每个绘制调用的相对定时,并帮助我找出花费时间最长的绘制调用。我可以在“Event Browser”中单击任何调用,并在“Render Target”查看器中突出显示。
优化:这时,我将寻找具有最高定时的绘制,并尝试确定原因。着色器过于复杂吗?输入资源属性设置不正确吗?我的渲染顺序异常吗?
6. 总结
我们已经介绍了将RenderDoc附加到Oculus Quest游戏或应用程序的基本知识,后面我们就以继续深入探索。我们很快将发布后续的博文,从而帮助你进一步了解硬件和软件堆栈,并为应用程序提供最佳的渲染方法和设置。如果你想挖掘更多的RenderDoc资源,请务必查看官方的RenderDoc网站和文档。你可能同时会发现其他方便的入门资源,包括简介,快速入门指南和Android使用指南。