1)为什么会有ATW?

  • ATW 又称异步时间扭曲,即Asynchronous Timewarp,这是一种中间帧的生成技术。原因是当无法满足足够的帧率时,它会通过中间帧弥补的技术从而维持较高的画面刷新率。同时也是为了解决画面剧烈颤动的问题;

    2)为什么会有Timewarp?

  • 常态下,以手机为例大部分是以60HZ的频率进行画面的刷新,那么就是说理想状态下手机的画面处理性能是是60fps。这样,从数据到渲染就有1000/60即大约16.6666666ms的时延。

  • 为了抵消这个时延,可以通过大量采集陀螺仪的数据,在样本足够的情况下,可以预测出16.6666666ms后头部应有的旋转和位置,那么就可以通过这个预测的数据进行渲染,这样Timewarp就诞生了。
  • 什么是Timewarp:

时间扭曲是把渲染好的一帧图像显示之前,根据场景被渲染之后头部又旋转角度加以矫正,得出相对当前头部位置更正确的一帧图像的技术,从而减少感知到的延迟。在虚拟现实上使用也可以提高帧率。这种是只针对旋转的时间扭曲。时间扭曲有一个比较大的好处,它是2D的扭曲,所以当和畸变(Distortion)结合的时候并不会消耗太多性能。和相对渲染一帧复杂的场景相比,时间扭曲只使用非常少的计算。

3)渲染技术存在的问题?

  • 对于VR的场景是比较复杂的,很难保证16.6666666ms内完成一次渲染,同样也很难保证每个运用都是60fps。这样ATW也就是异步Timewarp就要发挥应有的作用。

    4)什么是ATW技术?

  • 异步时间扭曲(ATW)在两个线程中完成TW的工作,一个线程负责渲染场景(Rendering Thread),另一个线程负责时间扭曲(ATW Thread)。在每一个VSYNC之前,ATW线程根据渲染线程生成的最新一帧图像,进行时间扭曲生成新的一帧图像,然后显示出来。

  • VR的应用中渲染管线这两个线程,即为渲染线程(即,生产者)和 Timewarp 线程(即,消费者),这两者异步工作,渲染线程即生产者、生产足够多的Framebuffer,Timewarp线程即消费者把生产者生产的东西经过Timewarp之后贴在屏幕上。这就是说,不论你当前游戏的fps多少,Timewarp始终被设计成保持在60fps。
  • ATW的核心是把 Timewarp 和产生 Framebuffer 分离,用高刷新率的 Timewarp 来换取低延时。

    5)如何执行 ATW 技术?

    image.png

    如图所示,GPU在渲染的过程中,在画面显示出来之前插入一个 ATW 的处理过程。在L1这帧的处理中,画面渲染及时完成,此时就可以直接显示了;在L2这帧渲染未能及时完成,此时如果不做任何的动作就会出现画面的抖动,如果使用 ATW 技术,它就会将前面一帧调用出来重新显示,虽然头盔在运动变化,但依旧可以保持帧率。

    6)ATW 技术的挑战和难点?

    ATW技术虽然很简单,核心代码貌似也仅有5行。假如期望达到最好的效果,但还需要以下几点需要check的内容:

  • 首先,GPU必须支持抢占式上下文(GPU preemption)。大部分Mobile GPU都是支持的,相反的桌面也就是PC版版的GPU大部分还未支持;

  • 其次,系统最好支持主表面写入,这个跟GPU有一定关系,但是跟操作系统关系比较大;
  • 最后,GPU必须有较高的性能,事实上也就是Timewarp线程实际上加重了渲染负担。

ATW技术的挑战:

  • 需要GPU硬件支持合理的抢占粒度,为什么呢?

1)GPU硬件要支持抢占,就是ATW线程的优先级要高于 Rendering Thread的优先级;
2)粒度要尽可能的小;

  • 目前一些GPU厂商和驱动支持 Batch 或 Drawcall 粒度的抢占。这种抢占粒度不够好,例如在极端的情况下,一个Drawcall伴随这复杂Shader运算很用以花费10ms的时间。
  • 其他一些GPU厂商和驱动支持计算着色器的抢占,但需要厂商的特定扩展,以支持渲染与计算的抢占。

如果ATW线程不能及时的抢占,将导致它不能在VSYNC之前扭曲生成一个新的帧,这样上一帧会显示出来,就会导致颤动现象。理想情况下,ATW线程能够任意的抢占并启动渲染,而不必关心渲染管线的状态。理论上,三角形的粒度抢占也是不够好的,因为不知道渲染一个三角形时使用一个复杂的shader需要花费多长时间。所以,GPU厂商一致在致力于实现更好的抢占。

  • 需要操作系统和驱动程序支持使GPU抢占(GPU的驱动扩展将影响线程的抢占)
    • 在Window8之前,WDDM(Windows Display Driver Model)支持“Batch Queue”粒度的有限制的抢占,“Batchs”是有图形驱动生成的。不幸的是,图形驱动倾向于积累大的批次从而提高渲染效率,这样对ATW线程的抢占就非常不好。
    • 在Window8之后,WDDM1.2开始支持更好粒度的抢占。但是,目前这种抢占模式还没有被图形驱动普遍支持。渲染管线管理在Window10 和 DirectX12时有重要的提高,此时向开发者提供更底层的渲染控制。所以,ATW一段时间内仍然需要GPU厂商定制的驱动扩展

如上图,Rendering Thread 在R1处开始渲染,到R2处渲染完成。ATW Thread 从A1处等待 Rendering Thread渲染,最迟在A2处开始执行渲染,在A3时渲染完成。
那么这里有几个问题:1. ATW Thread如何确保自己最迟在A2时开始渲染?
2. A2 到 A3 这段时间应该是多少比较合理?
解答问题:
1. ATW Thread 在 A1点调用
eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout) ; timeout 设置成执行TW渲染所需要的时间(一般为2~3ms)。
ATW Thread 调用此函数之后,ATW Thread就会挂起,直到 timeout 超时或被 Rendering Thread 调用 eglSignalSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode) 函数唤醒。
由于ATW Thread的优先级高于Rendering Thread,所以一旦ATW Thread被超时唤醒,那么ATW Thread将优先执行渲染。这里也设计到上面提到的抢占粒度,如果粒度过大,有可能ATW将无法完成渲染工作。

ATW技术的难点和局限:
位置抖动(Positional Judder)是ATW的一个难点。它是是基于方向的Timewarp带来明显瑕疵之一。在使用VR设备时,当头部移动了, 如果在ATW产生图像帧时只考虑了旋转,而平移却被忽略了。这意味着当你的头从一边移动到另一边时,你看见的离你很近的物体会有多个图像的抖动,这种效果在临近场空间中是非常明显的。比如下面的这个潜艇截图。
image.png

Gear VR比较容易用上ATW,是因为它不支持位置追踪,而PC平台的Oculus Rift支持。Oculus最近宣布Rift支持ATW,应该是解决了位置抖动的问题。总结由于位置的追踪问题,ATW会变得更加难。

另外一点是运动的物体和动画。使用ATW时,动画或者移动的物体会引起另外一个瑕疵, 因为它产生的新图像只是根据前一帧图像生成的,缺少了物体的运动信息,所有的中间帧都好像是被冻结了一样,因而对于运动的物体容易产生抖动,不过专家倒是认为虽然近处物体是个局限,但影响并没想像的那么大,见下图。
image.png

总体来说ATW确实是一项很棒的技术,如果没有它的话,开发者在游戏开发中为了保持画面帧率只能非常保守地使用CPU和GPU性能,而ATW可以游戏更容易保持帧率稳定,从而让开发者在画面设计上更加大胆。实际运行中Oculus发现,没有使用ATW的app在运行中丢失了约5%的帧。ATW可以将大部分丢失的帧补上,从而大幅减少画面抖动。而这一切对app来说不需要消耗更多性能或更改代码就能实现。Oculus还表示这一切只是开始,他们正与合作伙伴尝试提高ATW的运行效率

7)支持 ATW 技术的相关商家

  • Oculus先在Gear VR上实现ATW,原因就是上面的第1点。他们将ATW带到PC平台上,是在微软、英伟达和AMD支持的情况下实现的。英伟达开发了VRWorks,AMD则有Liquid VR。国内厂商中,乐相陈朝阳表示ARM对大朋VR提供了Front Buffer和Context Priority的支持,用以在移动VR上实现ATW。
  • 没有定制硬件的焰火工坊则在Oculus的基础上修改了一部分Timewarp的实现。“我们在渲染线程那里会监控Timewarp线程的工作情况,动态的平衡GPU附载,保证Timewarp线程工作在比较高的帧率下。”

8)画面显示案列:

  • 理想状态下的图形渲染显示:

image.png
图示-理想状态下的显示模式(依据头部方向,CPU的画面处理,GPU图像渲染,Compositor的信息显示)

  • 丢帧状态下的图形渲染显示:

image.png图示-理想状态下的显示模式(依据头部方向,CPU的画面处理,GPU图像渲染,Compositor的信息显示)
注意:
如上图所示,在第二阶段直到 Composition 的画面的显示 GPU 都没有完成渲染的图形,因此这个阶段需要使用ATW的方法完成渲染帧实现显示。在最左边这帧的处理中,画面渲染及时完成,此时直接显示就行了;到了第二阶段的帧渲染未能及时完成,此时如果什么都不做就会因缺帧而出现画面抖动,而有了ATW的话,它会将前面一帧调用出来重新显示,同时加上头盔运动变化,从而保持帧率。
image.png

image.png

立体眼睛视图被渲染为纹理,然后扭曲到显示器上,以校正耳机中广角镜头造成的失真。

为了减少运动对光子的延迟,在绘制时间扭曲之前,会为耳机检索更新的方向信息,并创建变换矩阵,但事实证明,这是最小程度的分散注意力。

时间扭曲通过使其成为“插值时间扭曲”而更进一步因为视频的扫描速度约为每毫秒120条扫描线,所以右边的扫描线比左边的扫描线延迟更大。在缓慢的LCD上,这并不重要,但在快速切换的OLED上,用户可能会感觉到当他们快速转动时,世界在微妙地拉伸或剪切。通过预测每只眼睛开始时的头部姿态(预测值<8毫秒)和每只眼睛结束时的头部姿态(预测值<16毫秒),可以纠正这种情况。这些预测用于计算时间扭曲变换,并在绘制的每条扫描线的这两个值之间插值扭曲。

时间扭曲可以在GPU上实现,通过使用片段程序渲染全屏四边形来计算扭曲纹理坐标以对眼睛纹理进行采样。但是,为了提高性能,“时间扭曲”(time warp)在整个屏幕上渲染一个均匀细分的三角形网格,其中设置纹理坐标以对眼睛纹理进行采样。使用扭曲的纹理坐标渲染三角形网格基本上会导致时间扭曲的分段线性近似。

如果时间扭曲与立体渲染异步运行,则它还可用于增加感知帧速率并平滑不一致的帧速率。默认情况下,时间扭曲当前对本机和Unity应用程序都异步运行。

9)NVIDIA VRWorks - 上下文优先

Context Priority为头显开发人员提供了对 GPU 调度的控制,以支持先进的虚拟现实功能,例如异步时间扭曲,它可以减少延迟并在游戏玩家移动头部时快速调整图像,而无需重新渲染新帧。结合 NVIDIA 基于 Pascal 的 GPU 的抢占支持,上下文优先提供更快、更灵敏的 VR 显示刷新。

硬件: 兼容:Maxwell(特定 SKU)和基于Pascal的 GPU。(GeForce GTX 900 系列和 Quadro M5000 及更高版本)
软件: 与以下 API 兼容:DX11DX12OpenGL(通过互操作)。


异步时间扭曲 (ATW)是一种创新技术,通过根据最新的头部跟踪输入调整渲染(扭曲)图像来减少延迟。
基于虚拟现实(VR)的ATW技术 - 图9
NVIDIA 提供 SDK 支持设置上下文优先级,这使开发人员可以更好地控制图形上下文和扭曲上下文之间的切换,使开发人员能够根据最新的头部跟踪输入进行后期扭曲,以进一步减少头部跟踪延迟。

为了执行时间扭曲,GPU 需要通过 VRWorks Context Priority API中断其当前的渲染任务,并快速重新分配任务以执行时间扭曲操作。

如果我们看看这如何应用于Maxwell,时间扭曲请求需要比理论限制稍微早一点,以适应 GPU 完成最后一次绘制调用所需的时间的任何变化。
基于虚拟现实(VR)的ATW技术 - 图10

在 Maxwell 中,一旦绘制调用(命令推送缓冲区)完成,GPU 就可以被中断。在 Pascal 中,我们添加了像素级抢占,因此 GPU 可以被细粒度地中断。
基于虚拟现实(VR)的ATW技术 - 图11
借助Pascal和对抢占的支持,我们可以以更精细的粒度中断 GPU,从而使我们能够减少缓冲区并在更接近显示扫描输出的情况下进行时间扭曲,甚至进一步减少感知延迟。

基于虚拟现实(VR)的ATW技术 - 图12

10) AMD方案介绍

利用ACE引擎实现异步空间扭曲计算提高VR头显画面质量

AMD在过去这些年中数次提及过异步计算,异步计算的重要性也在许多支持DirectX 12 和Vulkan的游戏中清晰体现,当然包括VR游戏。我们曾为AMD LiquidVR技术详细说明过异步计算的两个重要特性:

  • 异步时间扭曲(ATW)——有助于降低延迟及减少因丢帧造成的图像抖动。Oculus的ATW解决方案使用户和开发者都感觉自然易用。
  • 快速响应队列(QRQ)——被递交到该特殊队列的任务在异步运行时将被GPU优先处理,使之与其他工作重叠。

ATW在画面渲染的同时追踪用户的头部动作,并将最后一个完整的画面二次投影到用户最后一个头部位置对应的视点上。 这能确保在系统不能够及时完成新一帧完整画面的渲染时,头显内依然显示最新的画面。QRQ允许二次投影的过程与显卡渲染保持一致,使执行过程尽可能地快速和有效。
Oculus Rift头显内使用的ATW技术被证实其可以有效的减少延迟并为用户提供更为舒适的VR体验,但仍有一定的局限性。尤其是其只能补偿头部移动引起的渲染场景,而不能补偿渲染场景内发生的动作。移动的物体只是在他们最后所在的位置内被二次渲染,这在一定程度上会明显降低体验质量。
AMD已经宣布对异步空间扭曲(ASW)的支持,ASW是由Oculus提出的用以补足ATW并加强其效果的技术。ASW通过前面渲染的画面去检测之前的动作信息,并通过该信息去预测下一帧画面中场景元素的位置。该技术可使二次投影画面在被完全渲染后更加精准。
ASW必要的运动检测需要巨大的计算量,并且必须在下一帧画面呈现之前的几毫秒之内完成。最新版本的LiquidVR提供了连接到强大的VR图形处理硬件(AMD Radeon GPU)的接口,它们可生成必要的运动向量而不对图形引擎造成过多负担。
目前,中国诸多VR头显厂家正在和AMD中国团队深度合作,将ASW技术运用到他们自己的产品中,预计在2017年上半年这些具有ASW技术的头显会面市。这一技术和头显厂家的结合意在提高头显质量同时在不牺牲质量前提,降低开发者开发门槛和成本,促进VR进入普通消费级。

11)综述:

  • ATW/ASW是虚拟现实渲染标配的“弃帧保险;
  • 问题:
    • 由于ATW导致视觉的黑边,可通过扩大渲染的面积予以解决;
    • 虚拟现实技术中的体验过程中用户即便没有位移,眼镜也会发生位置的改变,因而引入ASW,前者(ATW)适用于远景静物,后者(ASW)侧重于近景动画。
  • vsync信号的调用:

虹宇信息:
主屏/副屏对应不同的vsync节点,比如高通平台可能主屏对应的是/sys/devices/platform/soc/ae00000.qcom,mdss_mdp/drm/card0/sde-crtc-0/vsync_event,副屏对应的是sde-crtc-1/vsync_event,具体可以在你们车机上根目录搜索一下vsync_event节点。android默认只把主屏的信号上报了,副屏没有上报,可以在内核代码里搜索一下vsync_event关键词看看有没有线索,可能和vblank有关

附录:

1,https://developer.nvidia.com/vrworks/headset/contextpriority
2,https://www.haosevr.com/4482.html