对立体渲染进行分析

关于在立体渲染项目中使用性能分析工具的概述。

Choose your operating system:

Windows

macOS

Linux

对使用 立体渲染 的项目进行分析在很多方面都和分析所有实时渲染项目相同,但也有一些需要特别注意的地方。

有何相同之处?

常用的流程在此过程中适用:找到瓶颈,然后选择合适的分析工具。

通常来说,第一步是使用stat unit 控制台命令来查看哪个线程具有最高的数量:

视口中显示线程时间

名称

说明

Frame

帧时是生成一帧游戏内容所花费的总时间。由于Game线程和Draw线程在完成一帧之前保持同步,所以帧时往往接近其中一个线程中显示的时间。

Game

如果帧时接近Game线程中显示的时间,则游戏的性能很可能会受到Game线程的阻碍(负面影响)。

Draw

如果帧时接近Draw线程中显示的时间,则游戏的性能很可能会受到渲染线程的阻碍。

GPU

GPU时间用来衡量显卡渲染场景需要多长时间。由于GPU时间会被同步到帧上,所以它很可能与帧时相同。

RHIT

通常,RHI线程时间会被同步到帧上,因此它很可能与帧时相差无几。

DynRes

如果支持(并启用),DynRes 将显示主要屏幕百分比和次要屏幕百分比。

构建配置

在分析时,务必对"测试"构建配置 进行分析。 这是与项目的代表性最终出厂版本最接近的性能选项,但仍然有一些有限的调试和分析功能。

VSync

在尝试分析GPU时,VSync 经常会发生问题,应该始终禁用。 它会在任意位置插入等待时间,而且会在查看最慢的代码在哪个位置时造成误导。

这还意味着,缺少少量的目标帧时将会导致帧率减半,以确保不会出现顶点撕裂。这通常会被误认为较大的性能问题,其实实际上只是一个将帧率推高到VSync限值以上的微小更改,而且通过一些分析和有针对性的项目端优化工作就可能轻松解决这一问题。

有何不同之处?

复合器

采用了立体渲染的头戴式显示器系统通常都会有复合器。复合器采用应用程序(在这种情况下为虚幻引擎)渲染的最终帧,并应用一个与头戴设备中的光学镜片中的帧相反的失真,以使图像看起来正常。复合器可以有选择地执行一些传统工作来缓解帧卡顿或低帧率,方法是插入内插帧和其他任务。

这些任务都需要时间才能完成。复合器经常最多只需1毫秒就可以完成这项工作,这意味着应用程序在每帧上有不到一毫秒的时间可以使用。在为项目的帧时间编制预算时,必须将这种现象考虑在内。和之前一样,平均帧时应该低于1秒除以帧数量的结果(复合器则要减1),从而解决偶发性卡顿。或者,可以使用动态分辨率 来降低分辨率,以满足复杂场景中的帧时预算要求,或者在GPU时间可用时,提高分辨率来使用全部GPU时间。

复合器强制开启的VSync

上述提及的VSync问题对于非立体渲染也会出现,但对于立体渲染,由于分辨率更高和时刻都在重新渲染,这些问题变得更加严重。更重要的是,大部分复合器都强制始终开启VSync。这意味着没有办法确保头戴设备中的GPU计时准确无误。虚幻引擎中对这个问题的解决方案是:使用 -emulatestereo 命令行参数来执行立体渲染,以监控屏幕并且不会对复合器造成干扰,从而禁用VSync。

延迟

虽然延迟严格来说不是性能问题,但对于创造舒适的XR体验来说是个严重的问题。

简单的流程只是按顺序模拟当前帧,然后渲染它。

点击查看大图。

如果使用这种简单方法,由于渲染需要等待模拟完成,因此要在11毫秒中完成所有工作会导致时间非常紧张。

其实,你可以让模拟工作稍微早于渲染工作。在虚幻引擎4中,这是在 Game线程 上运行的。等待过程发生在这个Game线程上,然后才是下一帧的模拟。渲染和提交发生在单独的线程(即 Render线程)上。

点击查看大图。

但是如果你要在模拟开始时在本机上查询姿势,并使用该姿势进行渲染,头戴式显示器可能会感受到"迟缓"或缓慢,因为现在在查询设备位置和显示结果帧之间可能会有两帧时间。

在渲染之前重新查询姿势并使用更新后的姿势来计算渲染的变换,就可以解决这个问题。

点击查看大图。

有一些布尔值用于控制这种行为。 用于场景中HMD视图的摄像机需要启用 锁定到HMD(Lock to HMD)。 禁用此选项将禁用延迟更新并增加延迟。 动作控制器也有一个 延迟更新(late update) 复选框。 如果觉得应用程序的响应速度达不到所需的命中目标帧率,那么应该进行检查以确保这些延迟更新设置已启用。

其他计时注意事项

除了VSync,立体渲染头戴式显示器还有其他注意事项,这些注意事项对于实现统一计时甚至更加重要,也让显示内容更容易发生卡顿。渲染非常依赖于对头戴式显示器和动作控制器等所有其他跟踪的设备(依赖程度较低)的动作信息进行准确及时的跟踪。

由于轮询HMD的跟踪位置数据和根据该位置数据来渲染帧需要以快速连续的方式进行,如果渲染线程落后于轮询位置数据的Game线程太多,Game线程就会等待渲染线程追赶上来。这意味着如果场景对GPU敏感,甚至可能会导致CPU开始等待。有时,这种现象会被误认为CPU上的逻辑太慢(就像VSync引起的问题有时候被误认为是GPU的逻辑太慢)。

此外,由于GPU和CPU之间存在计时互相依赖性,又因为GPU仍在渲染上一帧时,CPU可能已经开始处理下一帧,所以一个帧反应缓慢可能会造成一连串的延迟,需要多个帧才能恢复。当帧1上开始出现缓慢反应时,很难跟踪到帧3反应缓慢的原因,同理的情况还有很多。

标签
欢迎帮助改进虚幻引擎文档!请告诉我们该如何更好地为您服务。
填写问卷调查
取消