前言
国内的厂商对于VR头显的延迟总是显得不屑一顾,每次发布会上,都声称产品的延迟控制在18ms、17ms、16ms,仿佛拳打oculus、脚踢VIVE。中国的厂家真的这么厉害?到底VR头显的延迟以及造成晕眩是什么样的原因?
延迟是什么
VR“延迟”(delay)是指从人的头部移动开始一直到头显设备(HMD)的光学信号映射到人眼上面全部的等待时间(latency
time)。其中需要经过的全步骤如下图所示。
延迟会影响玩家的注意力,延迟较大的时候会产生晕动症(motion
sickness),也就是俗称的晕车晕船。其原理是视觉接受的自身的身体状态,与负责感知身体状态的中耳前庭器官不一致,中枢神经对这一状态的反馈就是恶心,来提醒身体状态的异常。简单来说,戴上VR头显移动头部的时候,由于延迟,视觉观察到的变化比身体感觉到的慢慢,产生冲突继而造成晕眩。
根据研究,这个延迟只有控制在20ms以内,人体才不会有排斥反应。同时超过20ms也不一定就会造成晕眩恶心,就像有些人晕车有的人不晕,每个人的体质对延迟的敏感度和排斥反应的大小不同。对于笔者来说,本身就容易晕车晕船,所以使用VR设备的时候延迟稍高就很快会晕;而一些人即使使用延迟比较高的设备,也不会立马就晕。
所以一些厂商宣称的所谓晕眩只是个别情况,产品设备本身完全没问题是不正确的。他们的产品并不是满足了20ms延迟的要求,从而让佩戴者不会产生晕眩。只是许多佩戴者的抗晕动症能力比较强,才没有产生晕眩。
美国传奇程序师,FPS和3D之父约翰·卡马克曾在2014年写过一篇文章介绍VR头显的延迟问题,在这篇文章的基础上,结合这两年VR行业相关技术的发展,来谈谈VR延迟的问题。
传感器以及信号传输造成延迟
从头部移动开始,VR头显内置陀螺仪或者空间定位仪器就会捕捉人体的移动,接受信号传输到电脑处理器中处理。
对于传感器本身而言,比较好的传感器帧率基本都在1000hz左右,所以传感器接收人体移动信号造成的延迟在1ms左右,再加上单片机处理信号和传输到电脑的工作,这一过程大概在3ms。
这一过程中,数据传输和滤波造成的延迟基本是固定的。但是由于传感器的帧率(比较好的传感器可以达到1000HZ)和渲染的帧率不一致,所以会带来一个可变的延迟。 在传感器方面,对头部活动的预测有可能降低一定的延迟。但是即使有一个很复杂的人类头部模型,这也只能处理头部以一个比较均匀的速度移动的情况,对于头部开始运动和运动状况剧变的情况很难处理。
合理安排传感器进行数据采样,一定程度上可以降低延迟。大多数模拟输入的任务不直接依赖于用户的输入数据,即是说这一数据的输入对一帧的延迟影响不大。如果在需要用户输入的数据时采样,而不是在一开始就离线缓存输入数据,则能减少总体的延迟。这种方法被称之为延迟帧调度(
late frame scheduling),其缺点在于需要大量的调度,提高了整体的功耗。
显示带来的延迟
然后就是图像显示造成的延迟。现在的头显屏幕主要分为LCD屏和OLED屏幕,现代技术下,一个优秀的LDC屏幕上面一个像素从一个值转变成另一个值需要大约10ms,经过优化这个数值可以降低一半。相比之下,OLED的像素转化所需要的时间更少,一般都在只1ms以内。
除此之外,有一个问题:传统显示器都是逐行显示图像的,所以对于一个60HZ的屏幕来说,底部的图像会比顶部的图像晚16ms。这在静止的屏幕里没有关系,但是在任何图像都是实时渲染的HMD里就会产生很大的差别。看起来就好像显示比较慢的边缘部分被减掉了,头部移动的时候画面也会由于延迟看起来就像是在震动。尤其是对刷新速率较高的使用OLED屏幕的HMD来说,显得非常明显。
不过随着屏幕技术的发展,现在的AMOLED以及TFTLCD这种有源矩阵屏幕的已经很好的解决了屏幕显示延迟的问题。这些屏幕上每一个像素点都可以控制开关,屏幕上的图像可以在同一时间显示,尤其使用AMOLED屏幕,可以把图像显示这一步的延迟控制到数毫秒之内。但是AMOLED屏幕的核心技术主要掌握在韩国,整体的出货量也比较低,国内很少有VR头显设备使用这种屏幕。
图像处理造成的延迟
图像处理的时间是指从输入信号以数字形式存储进内存开始,到做成下一个传输到屏幕里的完整的帧为止,需要花费的时间。
图像处理的工序主要分为数字信号的降噪、场景的渲染以及后续的反畸变反色散处理。主要有三种方式可以减少花费的时间以及提高最终的画质。
第一种是双GPU立体渲染。由于VR头显由两块屏幕组成,如果将图形处理系统分拆成两个,并分别配备一个 GPU,每个 GPU
只需单独渲染一块屏幕的图像,这样可以达到最佳的性能表现和最低的延迟,其代价是要求设备能够管理两个相互独立的渲染内容的缓存。如果设备无法维持两个 GPU
的缓存,设备的数据吞吐性能会下降,在缓存过载的情况下,还会导致帧率更严重地下降。
第二种降低延迟的方法是允许渲染层基于最新的采样数据修改游戏层传过来的参数(VIEW
BYPASS)。计算出本次用户输入与上次采样的差值,用于修改游戏层提交给渲染层的视图矩阵差值处理,从而减少处理的工作量。
第三种是Time Wraping,根据新输入的数据后期处理渲染过的图像。绘制出一副高质量的图像之后(使用过 View
bypass),这幅图像不直接显示,而是让开发者继续抓取用户输入的最新的数据,生成更新的视觉矩阵,然后计算出与输入数据相匹配的已渲染图像需要变形成什么样,放置在什么位置。经过这一次转换之后,渲染变形后的图像能与与用户实际操作后应该看到的图像更相符。
后二者的结合,相当于把用户的操作造成的图像渲染工作降到最低。而通过连续的time wraping,图像渲染花费的延时将被降到最低。而view
bypass则保证图像可以最大程度的避免最终呈像的视差。这种算法的出现,可以缩短图像渲染所花费的数十毫秒的延迟。
老包子语
如果这么来看,降低延迟应该是一件非常容易的事情。然而,这中间从传感器到屏幕到算法的各个工序,只要有一项出差错,就会提升产品的延迟,最终造成用户的晕眩。而很多厂商宣称的延迟,往往是理论计算值或者估计省略从头部移动到最终显示中间会耗费的一些工序。希望做VR设备的国内厂商,能够踏踏实实的从算法开始,一点点的打磨产品,最终真正解决20ms延迟这一VR头显的最低门槛
更多VR行业干货分享、第一手的VR资讯、独到的VR行业分析,尽在VR那点事,扫下方二维码关注。