Oculus说的“异步时间扭曲”技术又是什么鬼?

文章作者:薛睿东 文章来源:雷锋网 发布时间:2017-10-16

Oculus说的“异步时间扭曲”技术又是什么鬼?

Oculus说的“异步时间扭曲”技术又是什么鬼?

  如果你经常听国内一些技术流的VR创业公司的演讲,那么你对“异步时间扭曲”(ATW)这个词肯定不会陌生。例如自称国内第一家掌握ATW技术的焰火工坊,在他们的第一次发布会上CTO王明杨就提到了这项技术。

  一种生成中间帧的技术

  异步时间扭曲英文是Asynchronous Timewarp,简称ATW。简单来说,这是一种生成中间帧的技术。当游戏画面无法保持足够的帧率时,它能产生中间帧进行弥补,从而维持较高的画面刷新率。这项技术的提出者John Carmack目前是Oculus的CTO。

  我们采访了王明杨来解释ATW,他是这样说的:

  正常情况下,我们的手机大部分是60hz刷新,也就是说,在理想情况下我们的手机大概要处理有60帧/秒。那么,从数据到渲染就有 1000 /60 ~= 16.6666ms的时延。

  那么,如何抵消这个时延呢?卡马克(John Carmack)提出一种方法,通过大量采集陀螺仪数据,在样本足够多的情况下,就可以预测出16.66ms后你头部应有的旋转和位置,按照这个预测的数据来渲染,他管这个技术叫Timewarp。

  然而问题又来了,一般VR场景很复杂,我们很难保证每次都在16.66ms内完成一次渲染,也就是我们很难保证每个应用都是60fps。那么卡神又提出一个ATW,就是异步的Timewarp。

  他把VR应用的渲染管线设计成两个线程,渲染线程(生产者)和Timewarp线程(消费者),两者异步工作,生产者生产足够多的 Framebuffer,消费者把生产者生产的东西做Timewarp之后贴在屏幕上。也就是说,无论你当前游戏的fps是多少,Timewarp始终被设计成保持在60fps(视刷新率而定)。

  这就是ATW的核心细节,把Timewarp和产生Framebuffer分离,用高刷新率的Timewarp来换取低时延。

  Oculus团队为Rift消费者版增加了一项新功能。这项功能名为异步时间扭曲(Asynchronous Timewarp,以下简称ATW)。这是一项生成中间帧的技术。当游戏不能保持足够帧率的时候,ATW能产生中间帧,从而有效减少游戏画面的抖动。

  ATW 技术是一项令人兴奋的技术,因为它可以令VR设备在帧率下降的情况下保持渲染质量。简单一点来说,当你快速转动头部的时候,画面会发生抖动 (Judder)。抖动是一种术语,它是指设备无法同步渲染出与头部动作相应的画面。如上图,近场位置的画面抖动严重。这张图抖动的原因是只考虑了头部旋转的角度但忽略了平移量。所以,你会看到远景的位置很清晰,但近景的位置画面抖动。

  事实上,这项技术早已运用于三星的GEAr VR中,但基于PC的VR设备在运用这项技术的时候遇到一些挑战。和安卓系统不同,用于Windows系统的ATW需要GPU支持合理的抢占粒度、要求操作系统和驱动程序支持使GPU抢占。如今,Oculus团队终于把这项技术推出来了,这将修补画面抖动的20~100倍。对此,Oculus团队表示,将继续与微软、英伟达、AMD进行密切的合作,以优化Windows对Rift的支持。

  不过,ATW不是灵丹妙药,它存在一定的局限性。ATW生成的中间帧也可以导致用户有不舒服的感受,换句话说,ATW无法根本解决这种不舒服。所以,内容开发者还是要乖乖地把帧率保持于90Hz。

  VR公司常说的“异步时间扭曲”技术是个什么鬼?

  在虚拟现实设备中,为了正确在虚拟世界里呈现一个人们的感知,必须要在显示器上的定时更新图像,然而,如果渲染时间太长,一帧就会丢失了,产生的结果就是抖动,这是由于新的一帧图像还没有被渲染出来,显示器显示了上一帧的图像,如果一帧图像被两次渲染就会产生下面结果,如图:

异步时间扭曲

  这里,眼睛转向左侧,这时图像又被渲染一次,图像落在视网膜的不同部分,导致双影抖动。

  当然,双影并不是唯一的结果,如果同样的帧显示三次,就会产生三重影,以此类推。

  基于方向的时间扭曲可以解决上午位置重影抖动问题,如果游戏渲染帧没有和头部运动达成同步, 时间扭曲可以介入并产生一个图像替代还没有被渲染出来的帧。 自从最后一帧被渲染,通过扭曲最后一帧来反馈头部运动, 所以相比原始的帧加入ATW显示会减少抖动,如果不加ATW不知道会发生什么事情。

  这技术很难吗?

  据王明杨表示,ATW技术很简单,核心代码仅5行。但如果要达到最好的效果,还需要以下几点:

  1. GPU必须支持抢占式上下文(GPU preemption)。这个还好,大部分Mobile GPU都支持,但是桌面GPU大部分还不支持;

  2. 系统最好支持主表面写入,这个跟GPU有一定关系,但是跟操作系统关系比较大;

  3. GPU必须有较高的性能,这个很好理解,Timewarp线程实际上加重了渲染负担。

  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线程工作在比较高的帧率下。”王明杨说。

  有什么难点和局限?

  听起来ATW是项很棒的技术,但它也不是完美的。根据去年的一篇Oculus博文,ATW的一个难点是位置抖动(Positional Judder)。

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

Oculus说的“异步时间扭曲”技术又是什么鬼?

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

  另外一点是运动的物体和动画。使用ATW时,动画或者移动的物体会引起另外一个瑕疵, 因为它产生的新图像只是根据前一帧图像生成的,缺少了物体的运动信息,所有的中间帧都好像是被冻结了一样,因而对于运动的物体容易产生抖动,见下图:

异步时间扭曲

  总体来说ATW确实是一项很棒的技术,如果没有它的话,开发者在游戏开发中为了保持画面帧率只能非常保守地使用CPU和GPU性能,而ATW可以游戏更容易保持帧率稳定,从而让开发者在画面设计上更加大胆。

  实际运行中Oculus发现,没有使用ATW的app在运行中丢失了约5%的帧。ATW可以将大部分丢失的帧补上,从而大幅减少画面抖动。而这一切对 app来说不需要消耗更多性能或更改代码就能实现。Oculus还表示这一切只是开始,他们正与合作伙伴尝试提高ATW的运行效率。