VR 的GPU 技术方案

 

VR是借助一系列体感设备,通过计算机技术模拟人的感官,形成虚拟世界,达到身临其境的一种技术解决方案。GPU...



VR是借助一系列体感设备,通过计算机技术模拟人的感官,形成虚拟世界,达到身临其境的一种技术解决方案。GPU是VR 的关键技术之一。

时间扭曲(Timewarp)

其对图像的主要需求如下:

  1. VR对图片延迟的最低要求是小于20ms。业界通用的“光子运动”延迟最高为20ms。低于20ms的话,延迟就难以被察觉。
 

2.对同一图像需要渲染两次。简单的说,人的双眼看同一物体时,由于左右眼视线方位不同,视网膜上的图像会略有差别,即双眼视差,VR利用双眼视差原理在左右眼屏幕上分别显示两幅具有微小差别的图像,用户将两幅图像融合后得到一幅具有立体效果的图像。



3.沉浸感。最好的VR设备是你带上头盔后感觉和现实生活一样。无论你是前后移动还是旋转视角,看到的图像在经过底层算法优化和渲染后都是实时且逼真的,这种体验从视觉上欺骗你的大脑,配合着其他的感官交互,你完全感觉不到自己处在虚拟世界当中。otons in ≤ 20 ms

目前主流VR主要采用了时间扭曲,异步时间扭曲技术来处理掉帧和眩晕感。

一般来说一帧图像需要经过操作系统的三重缓冲,仅仅图像提交路径就会产生约3 Vsnc(50ms)的延迟。其在常见的应用场景中用户体验还是不错的。可是眼睛和屏幕的延迟非常明显。在VR中,看不了太久,延迟就会使人不舒服,甚至感到恶心,哪怕是观看相对静态的内容也不会有很大的改观。



为了解决帧率不足,提出了时间扭曲(Timewarp)方案。

时间扭曲是一种图像帧修正的技术,在使用VR时,由于头部运动过快,而造场景渲染的延迟,即头已经转过去了,但是图像还没有渲染出来,或者渲染的是上一帧的图像, 时间扭曲它通过扭曲一副被送往显示器之前图像,来解决这个延迟问题。 最基础的时间扭曲是基于方向的扭曲,这种只纠正了头部的转动变化姿势,这种扭曲对于2D图像是有优势的,它合并一副变形图像不需要花费太多系统资源。对于复杂的场景,它可以用较少的计算生成一个新的图像帧。



在虚拟现实设备中,为了正确在虚拟世界里呈现一个人们的感知,必须要在显示器上的定时更新图像,然而,如果渲染时间太长,一帧就会丢失了,产生的结果就是抖动,这是由于新的一帧图像还没有被渲染出来,显示器显示了上一帧的图像,如果一帧图像被两次渲染就会产生导致双影抖动,如果同样的帧显示三次,就会产生三重影,以此类推就会产生三重影等。从而搞晕用户,这就是VR的眩晕感。

为了解决眩晕体验,业界又提出了异步时间扭曲(Asynchronous Timewarp)。其是指在一个线程(称为ATW线程)中进行处理,这个线程和渲染线程平行运行(异步),在每次同步之前,ATW线程根据渲染线程的最后一帧生成一个新的帧。



然而实现ATW是有挑战性的,主要有两个原因:

  1. 它需要GPU硬件支持合理的抢占粒度。
  2. 它要求操作系统和驱动程序支持使GPU抢占。
让我们从抢占粒度开始,在90赫兹,帧之间的间隔大约是11ms(1/90),这意味着为了使ATW有机生成一帧,它必须能够抢占渲染线程并且运行时间少于11ms,然而11ms实际上不够好,如果ATW在一帧时间区间内任意随机点开始运行,那么起潜伏期(执行和帧扫描之间的时间)也将随机, 我们需要确保我们不跳跃任何游戏渲染的帧。

如果抢占操作不是很快,则ATW将无法抢在画面同步之前生成中间帧。  这样,最后一帧将会再显示,将导致抖动,这意味着一个正确的实现应该能够抢占和恢复任意渲染操作,和管线状态。

AMD ,NVIDIA 和ARM 都宣称他们的GPU能很好的支撑ATW.

双GPU技术

我们知道VR图像都被渲染成左右两个画面。这两个画面是不一样,会额外增加CPU和GPU的用量。虽然,有些计算不需要算两遍,比如物理计算,阴影图,游戏逻辑等等,但实际视角包含的画面肯定需要重新计算,以保证正确的时差和深度信息。所以说,有些极端情况下,虚拟现实渲染模式下GPU用量是翻番了的。

所以双GPU便营运而生。如AMD的LiquidVR™,NVIDIA 的VRSLI。



双GPU技术用在PC 机比较多。由于功耗和价格因素在手机上目前还没有看到双CPU的VR 设备。

直接显示(Direct to Display)

渲染完毕的图像可以绕开CPU直接将图像数据快速放入VR的缓冲区显示。所以这一特性能更大程度降低延迟,对Motionto Photon Latency的降低至关重要。

由于数据传输的时间大大缩短,这也降低了整个帧处理过程中渲染到显示的时间,从而能够降低Janks现象发生。在VR图形渲染显示过程中,一般会用到VSync,这一技术在传统显示器上也被广泛使用,其原理是根据显示器的固有刷新频率(如60Hz,即每秒显示60帧图像)来进行渲染显示。这就存在一个问题,如果某一帧渲染完成的图像交给显示器的时间超过了每次VSync的时间点,那么这一帧的数据将无法按时呈现在显示器上,这种现象就是Janks。

Shaders 技术的改进

如Nvidia 的Multi-Resolution Shading。

它的原理是把单个画面分割成不同形状的几个分区,这样就可以用不同的分辨率去渲染不同的分区,比如中间区域用高分辨率渲染,周围的区域用低一点的分辨率。而且这种分区的渲染不会额外占用计算资源。它可以让我们在不影响最终画面显示效果的前提下,提高计算资源的利用率。

AMD的异步着色引擎

其原理是在GPU处理中,异步计算是指将渲染与计算任务分别放入不同的队列同时执行;由于计算与渲染所用到的硬件单元并不完全重叠,所以同时执行计算与渲染任务可以最大程度利用硬件资源,从而达到提升性能的目的。性能的提升最直接地体现在fps刷新率的提升上,这也为增强画面质量提供了基础,可以为用户带来更加真实的VR体验。

ANDROID 中VR的处理

视频压缩

ARM IP均使用无损ARM帧缓冲压缩(AFBC)技术,以尽可能地减少帧缓冲存储器流量。从而使GPU和显示器间的帧缓冲交换时间减少。如ARM 的Mali GPU。Mali可以支持“多视图” OpenGL ES扩展,允许应用程序在一帧图像到达驱动器后提交绘制命令,同步完成左右眼的eyebuffer创建。这一流程可以显著缩短应用程序和驱动器需要的CPU计算时间。同时,进一步优化了Midgard Mali GPU的顶点运算能力,运行顶点着色器中不依赖眼睛的部分,并实现双眼共享。

Singlebuffer

简单的说其采用的是“直接显示”技术。在VR 设备中滤去了Surfaceflinger的参与,当GPU draw完一帧图片后,Panel直接读取buffer中的数据在 LCD上显示。该buffer对APP,GPU和MDP可见。当APP 需要draw image时,其向Gralloc申请一块buffer,然后向GPU 发送gl command。GPU 收到drawcommand 后开始draw。当Vysnc 到达时,MDP 查询GPU 是否draw完,如果draw完就把该buffer的数据显示在LCD上。LCD 显示完该帧后,返回该bufer到buffer qunue 中。如此循环。

传闻中ANDROID N 会增加VR 的支持,其很有可能采用singlebuffer的方案。


    关注 Android性能优化


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册