Facebook工程师分享:如何为Quest获取稳定GPU测量
如何为Quest获取稳定的GPU测量
(映维网 2021年05月11日)在为Quest开发内容时,获取精确和可重复的GPU帧时间测量非常重要。改动着色器、调整纹理大小、删除或添加绘制调用……即便是最小的变化都会影响应用程序的性能。
你可以通过一系列的工具来跟踪GPU时间,包括RenderDoc for Oculus、GPU Systrace、OvrgPupProfiler和Perfetto(但都存在一定的性能开销)。所述工具对于确定GPU时间变化原因非常有用,但对于初步调查而言,它们不一定能够派上用场。
日前,Oculus的软件工程师雷米·帕兰德里(Rémi Palandri)撰文介绍了如何为Quest获取稳定的GPU测量。下面是映维网的具体整理:
1. 确保应用一致性
在测量时,应用帧需要非常一致,而这是优化工具不能为你做的事情。对于VR开发,你应该将camera锁定到特定位置。预定位置的粗略查看并不足够,因为这会增加帧与帧之间的可测量抖动。另外,根据测试人员的不同,地板高度本身可能会对应用程序的GPU时间产生非常重要的影响。
在UE4中,我们可以将这个简单的blueprint添加到测试场景中:
在场景加载时,这将禁用来自头显的方向和位置追踪,并将其替换为设置的旋转和位置。应用程序现在有效地锁定了camera,而你可以利用timewarp查看始终面向同一方向的“平面”2D屏幕。
然后,移除动态对象(移动的NPC、帧间代价变化过大的粒子效果)并移除手部网格。当头显放在桌面并且头部位置锁定时,你会非常容易忘记双手,但它们依然会渲染。所以,你可以将它们设置为隐藏。
在Unity中,它可以以类似的方式实现。如果使用的是OVRCameraRig,请使用以下脚本覆盖camera/手势:
如果你直接使用Unity的XR子系统,你可以禁用camera game object的TrackedPoseDriver,并手动将变换覆盖到首选位置。
2. 消除系统更改
当确保了应用程序的一致性后,你可以删除来自系统的deltas源。所述deltas来自于在比应用更高的GPU优先级进程,所以它会随机中断应用程序的GPU工作负载,从而增加它们的总时间。两个这样的主要进程是Guardian和系统合成器(TimeWarp)。
对于所有的性能分析,我们建议关闭开发者设置下的Guardian。禁用TimeWarp有点棘手,因为禁用它会有效地冻结头显屏幕。在adb shell会话中调用以下命令将删除TimeWarp时间扭曲的绘制调用15秒:
3. 测量稳定的GPU数据
尽管头显现在是锁定屏幕,但应用程序依然有在下面渲染,并且它的所有指标都报告得非常完美。查看VRAPI日志,你应该会看到如下内容:
日志的“App=11.06ms”是操作系统测量的GPU时间。TW=0和GD=0表示Timewarp和Guardian被正确禁用。如你所见,应用程序端的测量非常稳定,最大往返0.01ms。你可以使用所述函数跟踪仅影响GPU时间0.02ms的情况,并用以比较变化。
这个过程可能需要一定的时间,不过,它对一个以性能为导向的团队而言非常有益。尽管你不需要对每个网格和每个场景都执行所述操作,但在回答“将光照贴图从1024切换到2048对GPU有何影响”等问题时非常有效。当你调整应用程序并最大限度地提高性能时,我们希望所述方法能够为你提供帮助。