(原标题:小菜硬件杂谈 说说VR里的异步时间扭曲)
实现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将无法抢在画面同步之前生成中间帧。这样,最后一帧将会再显示,将导致画面抖动。
Win10可以提供ATW足够的支持
另外一方面是操作系统对抢占的支持,在Win8之前的OS,Windiows显示驱动模型(WDDM)支持使用“批处理队列”粒度的有限抢占,对于內建的图形驱动程序趋向于大批量渲染,导致对ATW的支持并不是很好。虽然Win8改善了WDDM,支持更细的抢占粒度,但这些抢占模式不能被图形驱动程序普遍支持。好消息是渲染管线将在Win10及DX12中得到显著提升,但直到Win10变为主流之前,还是没有更好的方式来支持渲染抢占,其结果是ATW需要特定显卡驱动的支持。
说了这么多专业术语,想必很多读者已经云里雾里了,其实您只需要记住:ATW需要显卡和操作系统均能符合其要求才能很好地实现,而目前的桌面GPU和OS并不能做到很好地支持ATW,因此这是为实现ATW而需面对的挑战。
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。
乐相大鹏VR
国内厂商中,乐相科技表示ARM对大朋VR提供了Front Buffer和Context Priority的支持,用以在移动VR上实现ATW。而没有定制硬件的焰火工坊则在Oculus的基础上修改了一部分时间扭曲的实现,其在渲染线程那里会监控时间扭曲线程的工作情况,让GPU负载动态平衡,保证时间扭曲线程工作在比较高的帧率下。