异步时间扭曲 (ATW) 是一种在游戏无法保持帧速率的情况下生成中间帧的技术,有助于减少抖动。但是,ATW 不是灵丹妙药,它具有开发人员应注意的局限性。
    介绍
    在过去的一年里,异步时间扭曲 (ATW) 引起了很多人的兴趣。许多人希望 ATW 能让引擎以较低的帧速率运行和渲染,使用 ATW 人为地填充丢失的帧,而不会显着降低 VR 质量。
    在 Gear VR Innovator Edition 上,ATW 一直是提供出色体验的关键部分。不幸的是,事实证明存在内在限制和技术挑战,使 ATW 无法成为像 Rift 这样具有位置跟踪功能的 PC VR 系统上抖动的通用解决方案。在某些情况下,由于跳帧,VR 中时间扭曲颤动的感知效果几乎与颤动一样糟糕。
    在本博客中,我们分析了这些限制和导致特殊困难的情况。正如您将看到的,虽然 ATW 有时可能会有所帮助,但在提供出色的 VR 时,没有什么可以替代达到全帧速率。
    时间扭曲、异步时间扭曲和抖动
    Timewarp 是一种技术,它在将渲染图像发送到显示器之前对其进行扭曲,以校正场景渲染后发生的头部运动,从而减少感知延迟。其基本版本是仅定向时间扭曲,其中仅校正头部姿势的旋转变化;这具有作为 2D 扭曲的显着优势,因此与失真通道结合使用时不会损失太多性能。对于相当复杂的场景,这可以用比渲染一个全新的帧少得多的计算来完成。
    异步时间扭曲是指在与渲染并行(即异步)的另一个线程上执行此操作。在每次 vsync 之前,ATW 线程从渲染线程完成的最新帧生成一个新的时间扭曲帧。
    Michael Abrash 在2013 年的博客文章中详细介绍了 Judder 及其后果。回顾迈克尔关于颤抖的笔记将有助于充分利用这篇文章。
    为了产生虚拟世界的感知正确表示,显示器上的图像必须随着每次 vsync 刷新而更新。但是,如果渲染时间过长,则会丢失一帧,从而导致抖动。这是因为当没有渲染新帧时,视频适配器会再次扫描出相同的图像。如果同一渲染帧在更新前连续显示两帧,则对象位置如下所示:
    image.png
    在这里,眼睛向左旋转。当再次显示相同的图像时,其光线会落在视网膜的不同部分,从而导致重像抖动。
    当然,翻倍并不是唯一可能的效果。如果我们连续三次显示同一帧,你会在你的视网膜上得到一个三重图像,依此类推。
    仅定向 ATW 可用于帮助解决抖动问题:如果渲染的游戏帧未在 vsync 之前提交,timewarp 可以中断并生成图像,方法是扭曲最后一帧以反映自上一帧渲染以来的头部运动。虽然这个新图像不会完全正确,但它已经针对头部旋转进行了调整,因此与再次显示原始帧相比,显示它会减少抖动,如果没有 ATW 会发生这种情况。
    在某些情况下,简单的旋转扭曲可以很好地工作。它已在 Gear VR Innovator Edition 上实现,只要游戏无法满足帧速率,它就会填充帧。这将许多故障平滑到几乎不明显的程度。由于 Gear VR 缺乏位置跟踪,并且内容通常会避开近场物体,因此减少或避免了下面讨论的许多伪影。
    PC 上的 ATW 比 Gear VR 更具挑战性的原因有很多,首先是 Rift 对位置跟踪的支持。
    位置抖动
    位置抖动是仅具有方向性时间扭曲的最明显的伪像之一。当您移动头部时,ATW 生成的图像中只会反映额外的旋转分量,而自渲染帧以来的任何头部平移运动都将被忽略。这意味着当您将头部从一侧移到另一侧时,甚至只是旋转头部以平移您的眼睛时,您会在靠近您的物体上看到多幅图像抖动。在有近场物体的空间中效果非常明显,例如下面的潜艇截图。
    image.png
    具有受多图像抖动影响的近场物体的场景图像。
    那么,这种效果有多糟糕呢?
    位置颤动的程度取决于玩家所处的环境以及他们做出的动作类型。如果保持头部相对静止,只看风景,位置误差会很小,抖动不会很明显。
    注意: Gear VR Innovator Edition 通常就是这种情况,它不包括位置跟踪。尽管如此,头部模型会生成虚拟平移,因此当游戏在 Gear VR 上以半速运行时,您仍然可以观察到近场物体上的位置抖动。
    如果您正在看远处的物体,则由于您的头部运动而引起的位移变化不太可能明显到足以引起注意。在这些情况下,ATW 允许您环顾具有中远场几何形状的场景,而不会出现任何明显的抖动。
    另一方面,如果您处于具有近场细节的环境中,并且您平移了您的头部,则位置抖动将几乎与没有 ATW 的跑步一样糟糕。当您俯视带纹理的地平面时也是如此,该地平面距离不够远,无法避免伪影。由此产生的感知效果是一个有问题的、不稳定的世界,这可能会让人迷失方向和不舒服。
    位置时间扭曲
    解决位置抖动的一种可能方法是实现完整的位置扭曲,即对原始渲染帧应用平移和方向修正。位置扭曲需要考虑原始渲染帧的深度,以不同的量替换图像的各个部分。然而,这种位移会在对象边缘产生去遮挡伪影,其中原始帧中没有数据的空间区域未被覆盖。
    此外,位置扭曲更昂贵,无法轻松处理半透明,在某些抗锯齿方法方面存在问题,并且无法解决下面讨论的其他 ATW 伪影。
    移动和动画对象
    动画或移动的物体会导致 ATW 的另一个伪影:因为在不知道物体运动的情况下仅通过扭曲原始图像生成新图像,对于所有 ATW 生成的帧,它们被有效地及时冻结。该伪像表现为这些移动物体的多个图像——即颤动。
    image.png
    具有受颤动影响的移动物体的场景图像。
    该伪像的影响取决于游戏场景中动画物体的数量、投影面积和速度:如果移动物体的数量或大小较小或移动速度不快,则多个图像可能不会特别明显。但是,当移动对象或动画覆盖屏幕的很大一部分时,它可能会令人不安。
    此外,游戏渲染和设备刷新率之间的帧率比会影响运动抖动的感知质量。根据我们的经验,ATW 应该以游戏帧速率的固定比例运行。例如,在 90Hz 刷新率下,我们应该使用 ATW 达到 90Hz 或下降到 45Hz 的半速率。这样会造成重像,但重像在视网膜上的相对位置是稳定的。以中等速率渲染,例如 65Hz,会导致视网膜上图像的数量和位置不断变化,这是一种更糟糕的伪影。
    镜面反射和反射
    反射和镜面光的计算会考虑眼睛矢量或渲染相机矢量的方向,以生成为每只眼睛自定义渲染的图像。
    image.png
    image.png
    图表分别由维基百科和http://ogldev.atspace.co.uk/www/tutorial19/tutorial19.html提供。
    由于这个眼睛向量随着头部运动而变化,镜面反射和反射渲染在时间扭曲后不再正确。这可能会导致反射和镜面高光抖动。
    虽然镜面高光和反射是着色依赖于眼睛向量的两种最常见的情况,但许多其他依赖于眼睛向量的着色技巧也会有类似的问题。例如,视差贴图和浮雕贴图(又名视差遮挡贴图)将显示类似的伪影。
    执行
    实施 ATW 具有挑战性,主要有两个原因:

    • 需要GPU硬件支持合理粒度的抢占
    • 它需要操作系统和驱动程序支持来公开 GPU 抢占

    让我们从抢占粒度开始。在 90Hz 时,帧之间的间隔大约为 11ms。这意味着为了让 ATW 有任何机会生成帧,它必须能够抢占主线程渲染命令并在 11 毫秒内运行。
    然而,11ms 实际上还不够好——如果 ATW 在帧内的随机调度点运行,它的延迟(即执行和帧扫描之间的时间量)也将是随机的。而且,我们需要确保我们不会跳过任何游戏渲染的帧。
    我们真正想要的是 ATW 在视频卡翻转到新帧进行扫描前不久持续运行,有足够的时间来完成新的时间扭曲帧的生成。由于没有自定义的 vsync 触发的 ATW 中断例程,我们可以通过高优先级抢占粒度和大约 2 毫秒或更短的调度来实现这一点。
    事实证明,2ms 抢占一般渲染对于现代显卡和驱动程序实现来说是一项艰巨的任务。尽管许多 GPU 支持有限形式的抢占,但实现方式差异很大:

    • 一些供应商和驱动程序允许在批处理或绘制调用粒度上进行抢占。虽然有用,但这并不完美(例如,在极端情况下,具有复杂着色器的单个大型绘制调用很容易花费 10 毫秒)。
    • 其他供应商和驱动程序允许抢占计算着色器,但需要供应商特定的扩展来支持使用计算抢占渲染。

    如果抢占发生得不够快,ATW 将不会在 vsync 之前完成对新帧的扭曲,并且会再次显示最后一帧,从而导致抖动。这意味着正确的实现应该能够任意抢占和恢复渲染,而不管管道状态如何。理论上,即使是三角形粒度抢占也不够好,因为对于复杂的着色器,我们不知道渲染三角形需要多长时间。我们正在与 GPU 制造商合作以实现更好的抢占,但要普及还需要一段时间。
    等式的另一部分是在操作系统中呈现抢占支持。在 Windows 8 之前,Windows 显示驱动程序模型 (WDDM) 支持使用“批处理队列”粒度的有限抢占,其中批处理由图形驱动程序构建。不幸的是,图形驱动程序往往会为了渲染效率而积累大批量,从而导致抢占过于粗糙而无法很好地支持 ATW。
    在 Windows 8 中,随着 WDDM 1.2 增加了对更细粒度的抢占支持,情况有所改善;然而,这些抢占模式目前并未得到图形驱动程序的普遍支持。渲染管道管理有望通过 Windows 10 和 DirectX 12 显着改善,这为开发人员提供了较低级别的渲染控制。这是个好消息,但在 Windows 10 成为主流之前,我们仍然没有支持渲染抢占的标准方法。因此,在可预见的未来,ATW 将需要供应商特定的驱动程序扩展。
    ATW 很有帮助,但它不是灵丹妙药
    一旦我们拥有无处不在的 GPU 渲染管线管理和抢占,ATW 可能会成为另一个帮助开发者在 VR 中提高性能和减少抖动的工具。然而,由于我们在此概述的问题和挑战,ATW 不是灵丹妙药——VR 应用程序需要维持高帧率以提供最佳体验质量。在最坏的情况下,ATW 的伪影会导致用户有不舒服的体验。或者换一种说法:在最坏的情况下,ATW 无法防止体验不舒服。
    鉴于所涉及的复杂性和人工制品,很明显,即使有位置时间扭曲,ATW 也不会成为完美的通用解决方案。这意味着最好将仅定向和位置 ATW 视为坑洼保险,在偶尔跳过帧时进行填充。为了提供真正产生临场感的舒适、引人入胜的 VR,开发人员仍需要以 90Hz+ 的持续帧速率为目标。
    值得庆幸的是,提供令人难以置信的 VR 体验并不需要孤岛危机级别的图形。如果这意味着达到 90Hz 的甜蜜点,那么减少灯光数量、阴影细节和着色器复杂性是完全合理的。
    试图支持传统显示器和 VR 的双模式游戏将面临最大的性能困难,因为良好 VR 的陡峭性能要求很快成为对引擎可扩展性的挑战。对于这种情况下的开发人员,尽管存在工件,但 ATW 可能看起来非常有吸引力。然而,正如新媒体的典型情况一样,端口不太可能是最好的体验。以 90Hz 为目标的 VR 体验在创造舒适度、临场感和 VR 的真正魔力方面可能会更加成功。
    — Michael Antonov,首席软件架构师