榨取最大潜力,详细解读Oculus Go三大关键技术:动态节流,72Hz模式、固定注视点渲染
发布时间:2018-03-29 14:31 来源: 映维网
当Oculus Go正式发售的时候,这款设备将以合理的价格为用户提供卓越的性能。为了实现这一点,Oculus创新了数项需要开发者理解的技术,从而帮助其实现设备的最大潜力。希望通过这篇以技术为重点的文章来向你介绍和解释其中三种技术:固定注视点渲染(Fixed Foveated Rendering),动态节流(Dynamic Throttling) 和72Hz模式(72 Hz Mode)。
1. 固定注视点渲染(FFR)
我们先从固定注视点渲染技术开始。FFR这种技术主要是以低于中心注视点区域的分辨率渲染眼睛纹理的边缘。这种几乎无法察觉的效果降低了用户外围视觉的场景保真度。由于需要着色的总像素更少,因此FFR可以显著提高GPU的填充性能。借助FFR,一系列的应用程序都可以大幅度提高在眼睛纹理的分辨率,从而改善最终的图像。复杂的片段着色器同样能受益于这种多分辨率渲染形式。需要注意的是,Oculus的FFR技术不同于其他形式的注视点渲染技术,Oculus Go的系统不基于眼动追踪。高分辨率像素“固定”在眼睛纹理的中心。
1.1 畸变和像素密度的问题
与传统的2D屏幕不同,VR设备需要翘曲图像以匹配头显透镜的曲率。这种畸变能够为我们提供比单纯通过原始显示器感知的更宽视场。下图显示了畸变的影响:2D平面(水平线)翘曲成球形。
如果仔细观察,你会发现眼睛纹理在这种畸变过程中的像素表现非常不均匀。与创建视场中心所需的像素相比,我们需要更多的像素才能在视场边缘(侧边蓝色圆锥体)创建后畸变区域。这导致视场边缘的像素密度高于中间的像素密度。但这完全是适得其反的现象:用户大多是把注意力放在屏幕中心。最重要的是,透镜模糊了视场的边缘,因此即使你在眼睛纹理的边缘渲染了很多像素,图像的清晰度也会丢失。GPU花费大量的时间在视场边缘渲染像素,但用户却无法清晰地感知它们。
1.2 节省像素计算时间
为了避免时间浪费,固定注视点渲染会在计算过程中降低输出图像的分辨率。对于Oculus Go,这是通过控制GPU上各个渲染瓦片的分辨率来实现。Oculus Go搭载了高通821 SoC。与大多数移动芯片组一样,它是一个瓦片渲染器。瓦片渲染器不会像桌面GPU那样按顺序执行渲染命令,而是将工作量划分为矩形(或瓦片),然后进行并行渲染。通过控制各个瓦片的分辨率,并且确保眼睛缓冲区边缘的瓦片分辨率低于中心区域,我们可以减少GPU需要填充的像素数量,同时不会明显降低畸变后图像的质量。对于需要渲染大量像素的应用程序而言,或者对于采用昂贵片段着色器的应用程序而言,这能够带来非常显著的GPU性能优化。
下面屏幕截图是Oculus Go上的一个1024×1024眼睛缓冲区的瓦片分辨率乘数效应映射,其中FFR启动了最大的注视点渲染级别:
在视场中心的白色区域,分辨率是原生分辨率:纹理的每个像素都将由GPU独立计算。但在红色区域中只计算一半像素,绿色区域是四分之一,蓝色区域为八分之一,最后洋红色区域则只有十六分之一。当GPU将计算结果存储在通用存储器中的时候,系统将在解析时从所计算的像素中插值缺失像素。
固定注视点渲染不是一种通用的解决方案。由FFR引起的伪影可感知度取决于场景内容。例如在《The Well》运行FFR的时候,我们可以看到圣池场景中的高对比度文本元素出现了显著变化。下图是在四种不同FFR设置下的部分渲染场景(左边没有启用FFR,右边则是最大值的FFR),主要侧重于头显屏幕右下角区域:
我们可以注意到,像Oracle的手臂和她的直接环境等低频内容完全不受FFR的影响。但高频纹理(如文本)由于是以较低的分辨率进行渲染,其出现了严重的像素伪影。在观察“Oracle”这个单词时,你甚至可以发现一个个单独的瓦片。其中,单词左侧和右侧是在以不同设置渲染的不同图块上呈现。我们难以在头显内部注意到这种伪影,因为它们只出现在我们的外围视场,而且透镜模糊了它们。固定注视点渲染的API允许开发者调整FFR级别(甚至是逐帧调整),这样可以在最大限度上减少可见的伪影。在大多数情况下,我们只需为游戏内场景启用FFR,而菜单或UI屏幕中则调低或关闭FFR。
Unreal 4,Unity和原生应用程序可以从固定注视点渲染中受益。我们注意到,像素密集型的应用程序获得了高达25%的增幅。请注意,如果应用程序搭载了不受GPU填充限制的简单着色器,固定注视点渲染可能无法为其带来显著的提升。
2. 动态时钟节流和移动性能管理
所有移动设备都必须处理散热和电池问题。移动芯片组的效率非常高,但它们在处理棘手问题时仍会产生大量的热量,并且消耗大量的电量。在手机或平板电脑上,过载的移动CPU通常会降低速度以避免过热,这是正常现象。在VR设备上,这通常会导致应用程序的帧率丢失,并且立即造成用户不适。一直加热直至性能下降对于VR头显来说不是一个优秀的解决方案。
为了帮助开发者管理应用程序整体的热耗,Oculus为Gear VR开发了固定时钟策略(Fixed Clocks Policy)。开发者可以选择一个CPU和GPU“级别”,这可以支持他们动态地上下调整芯片的时钟速度。这种系统可以帮助开发者根据需要将电能路由至CPU或GPU,并在空闲时段或简单场景中降低整个系统的时钟速度。早期的Gear VR游戏《Herobound》就是根据每个人的需求设置了不同的CPU和GPU时钟。
对于Oculus Go,Oculus简化了CPU和GPU的级别管理,令其变成几乎是完全自动运行。Oculus将这项功能称为动态节流(Dynamic Throttling)。
Oculus Go的应用程序与Gear VR兼容,而且基本电源管理API保持不变。开发者可以将CPU和GPU级别设置在0和3之间,而这将转换为芯片可以运行的不同时钟速度。但现在这种级别已被视为基准,而为了保持性能,系统可以根据需要选择动态地计时CPU和GPU。这一系统的目标是保留Gear VR固定时钟策略的优势,同时试图减轻固定时钟策略的缺点。
Oculus Go的散热比智能手机更高效。这使得Oculus能够创建CPU和GPU级别4,从而释放出比S7更高的性能。Oculus希望平台上所有的应用程序(不仅只是为Oculus Go开发的应用程序)都能从这种改进中受益。根据以前的工作,Oculus开发了一个可以根据CPU和GPU利用率调整节流级别的动态系统,从而最大限度地提高性能并且最大限度地减少热量增加和电池消耗。
编写动态调节器听起来似乎很简单,但实际上并非如此。一个主要挑战是构思出能够实际量化处理器利用率的方法。
对于GPU来说,这是一个非常简单的任务。GPU是高度并行的系统,但它们一次只能处理一个问题。要么GPU正在处理帧(计算像素,传输数据等等),要么它什么都不做。最后我们计算GPU利用率的方法是,简单地将GPU工作时的计时周期数除以GPU执行频率中的计时周期数。由于Oculus Go的管道是并行进行(在GPU渲染最后一帧的时候CPU处理下一帧),所以我们很容易判断GPU是不是瓶颈:要么充分利用了GPU并且导致CPU等待;要么GPU不是瓶颈。在查看节流机会的时候,GPU利用率低于90%,因此表明应用程序不受GPU限制,因此我们不需要提高其时钟速度。
但计算CPU的利用率要困难得多。Oculus Go的CPU是多核处理器:一个内核可以在另一个内核处于休眠状态时工作,这使得我们很难判断CPU执行速度是不是应用程序整体性能的瓶颈。例如,请留意下图这个资源密集型应用的追踪信息。
你可以发现上图存在大量的白色区域,表明这是一个“无所事事”的内核,看起来这个应用程序似乎存在很多空闲周期。但请仔细观察,其中一个内核(CPU 2)几乎受限于渲染线程(RenderThread):一次渲染线程执行的结束与下一帧新周期开始之间的时间差不到一毫秒。在这种情况下对CPU进行计时会导致帧丢失。
查看多核处理器的原始利用率可以提供一定的有用信息,但不足以支撑CPU节流的正确决策。幸运的是,我们在运行时内置了另一个信号,这可以帮助我们判断适合节流的应用程序:丢帧计数器。在VR中渲染时,Oculus的API会追踪每一个丢失帧。低丢失帧的应用说明它正在实现其目标帧率,而且或许能以较低的时钟速度运行。另一方面,当GPU显然不是瓶颈时,一个丢失大量帧的应用表明即使某些内核似乎正在“睡觉”,我们也应该提高CPU的时钟速度。
Oculus Go的调速器永远不会将CPU或GPU的时钟速度调低至开发者设置的级别。但当调速器检测到系统负载很重的时候,它会提高时钟速度以确保更流畅的体验。下图是Oculus Go首次运行搭配高端着色器的Unreal 4应用《Daedalus》的第一关,其中关闭了动态节流功能。红线代表了GPU利用率。底部洋红线代表了丢失帧。绿线是GPU级别(因为动态节流器关闭,所以保持不变)。棕色线和蓝色线则代表CPU利用率(分别为代表全内核运行和最差内核运行)。
尽管前45秒的运行没有任何问题(开头丢帧的出现主要是因为关卡加载),但你可以看到GPU利用率一直都的维持在非常高的水平,大约是85%。在50秒后,GPU利用率达到95%的高峰。随着GPU成为瓶颈(红线上升),掉帧开始出现。最高峰时,在平均每秒帧率为40fps的情况每秒丢失20帧。
如果你运行相同的应用和关卡,并且启用Oculus Go的动态节流,图表将如下所示:
虽然应用程序要求GPU级别2,但系统将时钟速度提高至GPU3,从而将利用率维持在75%左右。系统正确地判断应用程序不受CPU限制(未出现丢失帧),因此CPU时钟在整个会话期间都保持在级别0。在接近捕捉结束时,亦即大约50秒后,系统注意到GPU负载已经增加,所以将GPU的时钟频率提升至级别4。GPU负载峰值在约15秒后结束,而系统则相应地降低了GPU的时钟频率(一下子降至级别2)。如图表所示,
当结合固定注视点渲染时,动态节流可以为Oculus Go解锁新的性能水平。这种性能可以应用于更优秀的场景或着色器复杂度,或者轻松用于增加眼睛纹理分辨率,在无需改动asset的情况下提高应用的视觉质量。部分开发者可能同样选择在Oculus Go的支持的新模式上花费一定的额外帧时:72Hz模式(72 Hz Mode)。
3. 72Hz模式(72 Hz Mode)
Oculus为Oculus Go带来的另一项新功能是72Hz模式。借助这一模式,Oculus Go应用可以把目标帧率瞄准72fps,而非常规的60fps。这种模式并非强制,只是单纯的可选项。72Hz模式在特定情况下的成本投入非常大,但能够显著提高支持应用程序的质量。
3.1 为什么是72Hz模式呢?
一般来说,VR设备的高帧速率与降低延迟相关联,特别是在涉及位置追踪的时候。Oculus Go不是一款定位追踪设备,虽然较低的头部追踪延迟很舒适,但这不是以72Hz速度运行的主要原因。相反,72Hz模式是的目标是改善显示器的视觉质量。
Oculus Go的显示器在60Hz已经能带来舒适的体验。72Hz模式允许显示器变得更明亮,同时不会造成可感知的抖动,从而提高屏幕的视觉质量。特别地,由于这种模式令显示器更明亮,颜色将显得更柔和。
3.2 为72Hz进行优化
当运行在Oculus Go时,任何可以支持72fps的应用程序都应该使用72Hz模式。这意味着渲染速度至少比平时快2.8毫秒(通常而言这并不总是可以实现)。结合动态节流和固定注视点渲染,部分应用可以直接启动这一模式并以更高的帧率运行。其他应用则需要进行大量的优化才能实现这一性能水平。再次强调,72Hz模式是可是一个可选项,并非强制要求。
4. 视频
视频应用应该仔细考虑72Hz 模式。与72fps相比,以30fps或60fps渲染视频的应用程序在60fps速度下的画面看起来更好。另一方面,在72Hz模式下运行时,24Hz的视频看起来将好很多,因为显示器和视频帧速率是同步的,能够避免画面撕裂(24是72的偶数除数)。你可以在运行时无缝切换模式。
5. 加油吧
为了令Oculus Go成为市场上最佳的VR一体机设备,Oculus投入了大量的经历。随着诸如固定注视点渲染,动态节流和72Hz模式等功能的增加,Oculus期望将能降低为设备开发出优秀应用的众多阻碍。Oculus表示,他们将继续为开发者的前进清除障碍。所以,请大家加油吧。
推荐阅读