实现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而需面对的挑战。
推荐经销商