映维网,国际权威虚拟现实(VR)信息平台,提供最快、最全、最有价值 VR 信息资讯!

文章相关引用及参考:oculus

映维网希望通过这篇以技术为重点的文章来向你介绍和解释其中三种技术

(映维网 2018 年 03 月 24 日)当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 模式是可是一个可选项,并非强制要求。

3. 视频

视频应用应该仔细考虑 72Hz 模式。与 72fps 相比,以 30fps 或 60fps 渲染视频的应用程序在 60fps 速度下的画面看起来更好。另一方面,在 72Hz 模式下运行时,24Hz 的视频看起来将好很多,因为显示器和视频帧速率是同步的,能够避免画面撕裂(24 是 72 的偶数除数)。你可以在运行时无缝切换模式。

4. 加油吧

为了令 Oculus Go 成为市场上最佳的 VR 一体机设备,Oculus 投入了大量的经历。随着诸如固定注视点渲染,动态节流和 72Hz 模式等功能的增加,Oculus 期望将能降低为设备开发出优秀应用的众多阻碍。Oculus 表示,他们将继续为开发者的前进清除障碍。所以,请大家加油吧。

文章《榨取最大潜力,详细解读 Oculus Go 三大关键技术:动态节流,72Hz 模式、固定注视点渲染》首发于 映维网。

相关文章