1ATW技术解决眩晕难题
3月份的GDC 2016大会上,著名VR公司Oculus为Rift消费者版增加了一项新功能,这项功能名为异步时间扭曲(Asynchronous Timewarp,简称ATW),目前这个词已经成为国内一些技术流的VR创业公司的演讲必提要点。那么听起来很科幻的“异步时间扭曲”技术究竟有什么作用?接下来我们就一起聊聊有关ATW的方方面面。
异步时间扭曲简单来说就是一种生成中间帧的技术。当游戏画面无法保持足够的帧率时,它能产生中间帧进行弥补,从而维持较高的画面刷新率。这项技术的由Oculus的CTO John Carmack提出,是目前被认为能够解决眩晕问题的有效手段。说到这里你一定会产生疑问,这技术怎么就能解决眩晕问题了?别着急,听我慢慢道来。
体验过VR的朋友们都知道,当你戴上VR眼镜并快速转动头部时,你所看到的画面就会发生抖动。“抖动”是一种VR术语,它是指设备无法同步渲染出与头部动作相应的画面。当画面产生抖动时,人自然而然就会有眩晕感产生,因此想要拜托眩晕感就需要改善画面抖动的问题。上文说了,ATW就是产生更多的帧去弥补较低的画面刷新率,因此即使快速切换画面场景,也有足够的帧数来保证画面的连贯性,从而减少抖动,进而降低眩晕感。
ATW技术让VR设备保持较低帧率运行看到了希望,在虚拟现实穿戴设备中应用ATW技术,人为地填充中间帧,即使在帧率下降的情况下,也不会使渲染质量有显著的下降。总而言之,这项技术可以有效地降低延迟,提供更清晰稳定的图像,并且降低VR使用者的眩晕感和不适感。看起来有了这项技术,由于VR设备性能不足所导致的问题就可以迎刃而解,但事实真的是如此么?有了这个技术真的就可以彻底解决让人头疼的眩晕问题了么?接下来让我们从原理上了解一下这个技术。
2时间扭曲和异步时间扭曲
时间扭曲和异步时间扭曲
大家都知道,大部分的显示器和绝大部分的手机屏幕的刷新率都是60Hz,也就是说,在理想情况下我们的显示设备大概要在每秒处理60帧的画面,也就是说从数据到渲染就有1000/60≈16.6666ms的时间延迟。那么,如何抵消这个时延呢?John Carmack提出一种方法:通过大量采集陀螺仪数据,在样本足够多的情况下,就可以预测出16.67ms后你头部应有的旋转和位置,按照这个预测的数据来渲染,他管这个技术叫时间扭曲。
帧延迟
时间扭曲说白了就是一种图像帧修正的技术,它通过扭曲一副被送往显示器之前图像,来解决这个16.67ms的延迟。最基础的时间扭曲是基于方向的扭曲,这种只纠正了头部的转动变化姿势,这种扭曲对于2D图像是有优势的,它合并一副变形图像不需要花费太多系统资源。
然而问题又来了,一般的VR场景很复杂,我们很难保证每次都在16.67ms内完成一次渲染,也就是说我们很难保证每个应用都是60fps。于是John Carmack又提出一个技术,就是上文我们所说的异步时间扭曲。说专业点,异步时间扭曲是指在一个线程(称为ATW线程)中进行处理,这个线程和渲染线程平行运行(异步),在每次同步之前,ATW线程根据渲染线程的最后一帧生成一个新的帧。可以这么说,无论你当前游戏的fps是多少,画面始终被设计成保持在60fps(视刷新率而定),这样就不会产生画面抖动了。
以上就是ATW技术的核心细节,即把时间扭曲和帧缓冲分离,用高刷新率的时间扭曲来换取低时延。事实上,这项技术在一年前便已经运用于三星的GEAR VR中,但PC的VR设备在运用这项技术的时候遇到一些挑战,致使这项技术在今年Q1尾声才被Oculus宣布支持。Oculus团队表示,将继续与微软、NVIDIA、AMD进行密切的合作,以优化Windows对Rift的支持。
3实现ATW的方法
实现ATW的方法
具体该如何实现ATW呢?请看下面这张图,这张图展示了GPU给左右眼的画面分别进行渲染,然后在画面显示出来之前插入一个ATW的处理过程。
ATW处理过程
在左边这帧的处理中,画面渲染及时完成,此时直接显示就行了;中间的第二帧渲染未能及时完成,此时如果什么都不做就会因缺帧而出现画面抖动,而有了ATW的话,它会将前面一帧调用出来重新显示,同时加上头盔运动变化,从而保持帧率。
前文提到在PC端实现ATW时会遇到一些挑战,挑战主要有两个:一个是需要GPU硬件支持合理的抢占粒度,另一个是要求操作系统和驱动程序支持使GPU抢占。让我们从抢占粒度开始说明,在90Hz刷新率下,帧之间的间隔大约是11ms(1000/90),这意味着为了使ATW有机生成一帧,它必须能够抢占渲染线程并且运行时间少于11ms。然而11ms实际上不够好,如果ATW在一帧时间区间内任意随机点开始运行,那么在执行和帧扫描之间的时间也将随机,而我们需要确保我们不跳跃任何游戏渲染的帧。
为VR打造的AMD Radeon Pro Duo
我们的目标是使ATW一直在非常短的时间内运行,短到在GPU产生新的一帧之前结束,刚好有足够的时间来完成中间帧的生成。为了获得高优先级抢占粒度和调度,最好在2ms或更少的时间内运行。然而,对现在的显卡和驱动来说,2ms抢占是一个艰巨的任务,虽然许多GPU支持有限的形式的抢占,但执行上存在显著差异。如果抢占操作不是很快,ATW将无法抢在画面同步之前生成中间帧。这样,最后一帧将会再显示,将导致画面抖动。
另外一方面是操作系统对抢占的支持,在Win8之前的OS,Windiows显示驱动模型(WDDM)支持使用“批处理队列”粒度的有限抢占,对于內建的图形驱动程序趋向于大批量渲染,导致对ATW的支持并不是很好。虽然Win8改善了WDDM,支持更细的抢占粒度,但这些抢占模式不能被图形驱动程序普遍支持。好消息是渲染管线将在Win10及DX12中得到显著提升,但直到Win10变为主流之前,还是没有更好的方式来支持渲染抢占,其结果是ATW需要特定显卡驱动的支持。
说了这么多专业术语,想必很多读者已经云里雾里了,其实您只需要记住:ATW需要显卡和操作系统均能符合其要求才能很好地实现,而目前的桌面GPU和OS并不能做到很好地支持ATW,因此这是为实现ATW而需面对的挑战。
4ATW技术很难实现么?
ATW技术很难实现么?
从原理上看,这个技术貌似挺高大上的,但其实ATW技术的核心代码只有区区5行,不过要达到最好的效果,还是得满足以下几点:
1、GPU必须支持抢占(GPU preemption)。其是指在可以进行上下文切换的同时,图形处理将会被给予更高的优先权,以使图形处理的延时未免受多任务处理影响。这个功能大部分移动GPU都支持,但是很多桌面GPU还不支持;
三星GEAR VR
2、系统最好支持主表面写入。这个跟GPU有一定关系,但是跟操作系统关系比较大,如Win10对主表面写入的支持就较好。
3、GPU必须有较高的性能。这个很好理解,时间扭曲线程大大加重了渲染负担,因此最好是能使用旗舰级的GPU,VR入门级的GTX 970或R9 390可能并不能给与ATW足够的硬件支持。
Oculus之所以先在Gear VR上实现ATW,是因为上面第1点所说的移动GPU支持抢占,而这次他们将ATW带到PC平台上,是在Microsoft、NVIDIA和AMD的共同支持下实现的。微软提供OS上的支持,英伟达开发了VR Works,AMD则有Liquid VR。
国内厂商中,乐相科技表示ARM对大朋VR提供了Front Buffer和Context Priority的支持,用以在移动VR上实现ATW。而没有定制硬件的焰火工坊则在Oculus的基础上修改了一部分时间扭曲的实现,其在渲染线程那里会监控时间扭曲线程的工作情况,让GPU负载动态平衡,保证时间扭曲线程工作在比较高的帧率下。
5ATW的难点和局限
ATW的难点和局限
前面说了实现ATW对GPU和OS的要求,接下来该说一说这个技术需要解决的技术难点了。难点主要有两个,一个是位置抖动,另一个是运动的物体和动画引起的瑕疵。
位置抖动是最明显的用基于方向的时间扭曲带来瑕疵之一,在使用VR设备时移动头部,如果在ATW产生图像帧时只考虑了旋转分量,那么任何头部平移分量都将被忽略。这就意味着当你的头部从一边移动到另一边时,哪怕只是旋转你的头或转动你的眼睛,你将看见离你很近的物体会有多个图像叠加的抖动,这种效果在临近场空间中是非常明显的,比如下面的这个潜艇截图:
位置抖动示意图
那么,这种影响有多严重?抖动的程度取决于玩家的运动方式,如果保持头部相对静止并且只看风景,这种颤动将并不显著,可以忽略不计。另外,如果看远处物体,头部运动也不太可能引起明显抖动。换句话说,如果你离场景非常的近,当你头部移动的时候,位置抖动将会相当明显,就像没有ATW一样。这种抖动也会出现在当你近距离看带纹理的地面的时候,由此产生的感觉是一个让人望而生畏、不稳定的世界,让人非常迷茫和不舒服。
另外一点是运动的物体和动画。使用ATW时,动画或者移动的物体会引起另外一个瑕疵,因为它产生的新图像只是根据前一帧图像生成的,缺少了物体的运动信息,所有的中间帧都好像是被冻结了一样,这个伪影表现为这些移动的物体,即抖动的多幅图像。因而对于运动的物体来说容易产生抖动,如下图:
这个虚影的影响取决于场景中物体数量、投影面积及运动速度等条件,如果物体个头小、运动速度慢,那么抖动将不是特别明显。如果物体快速移动或覆盖屏幕很大一部分,抖动将十分剧烈。虽然ATW处理近景物体是个问题,但影响并没想像的那么大。
6总结:ATW不是万能的
总结:ATW不是万能的
总体来说ATW确实是一项很棒的技术,如果没有它的话,开发者在游戏开发中为了保持画面帧率只能非常保守地使用CPU和GPU性能,而ATW可以游戏更容易保持帧率稳定,从而让开发者在画面设计上更加大胆。此外,ATW还可以很大程度上减少画面抖动,从而降低使用者的眩晕感。
异步时间扭曲
然而,上文我们已经提到,ATW是有局限性的,VR应用最好是维持较高的帧率,以提供最好的渲染质量。ATW生成的中间帧也有可能导致用户有不舒服的感受,换句话说,ATW无法从根本上解决这种不舒服。为了产生一个舒适,令人信服的VR空间,开发人员仍然需要保持帧率在90Hz。
用ATW的VR应用在运行中丢失了约5%的帧。ATW可以将大部分丢失的帧补上,从而大幅减少画面抖动,而这一切对应用来说不需要消耗更多性能或更改代码就能实现。Oculus还表示这一切只是开始,他们正与合作伙伴尝试提高ATW的运行效率。
这期的小菜硬件杂谈就到这里,喜欢该栏目的读者可以点击下方链接,看看我往期的文章。我们下期见!
推荐经销商