简介
本文介绍了如何充分提升虚拟现实 (VR) 项目的性能、视觉效果和设计功能。本文主要讨论了特定的虚拟现实问题,多数问题的起源可以追溯到核心优化领域,如多边形数量、常见的性能错误以及如何应用更高效的质量解决方案。由于我们正在编写虚拟现实模式,我还会与您分享教科书上没有的技巧、方法和专业建议。
从本质上看,尽早且经常优化更为简单。设想一下在火车上维持一架十字形跷跷板的平衡,跷跷板的每个座位上都有一枚针,针上有一个保龄球。4 个保龄球分别代表了项目的 4 个负载:封装尺寸、CPU、GPU 和 RAM。火车代表了项目中不断变化的其他部分。由此可以得出,这个过程是一个不断平衡的过程,必须了解所有的移动部件,才能更全面地分析这个项目。
了解这些优化对象的原理非常重要。为了更好地解决每个资产所面临的性能优化问题,需要与设计人员、编码人员和美工沟通,了解他们的技术。如果您知道设备的组装方式,便可以将它拆卸,了解如何提高各个零件的协作效率。花费精力进行优化有助于发挥每个游戏的独有优势。

优化前

优化后
入门指南
尽管虚拟现实提供了许多新的机遇,但是大多数项目采用了前几代的视觉效果。本文介绍了虚拟现实面临的挑战,开发人员应对挑战的措施,以及怎样帮助开发人员应对挑战,本文从开发人员的角度入探讨了性能。读者需要深入了解游戏引擎技术,对充分利用系统功能非常感兴趣。本文主要介绍了自动系统的管线创建,以优化资产,利用与优化相关的高级技术。本文不是一篇标准的游戏优化概述;游戏优化方面的资源已经非常丰富。本文的重点讨论了“需要优化数千个资产但是人手不够”和“正在尽力优化但帧速率仍旧很低”两个主题。我们从概念、代码和流程入手详细说明了这两个主题,以使您的项目运行速度达到最快。
首先,我们介绍了虚拟现实速度下降的原因以及应对措施。参阅以下文章获取关于总体优化的更多信息,了解如何确定瓶颈以及寻找最佳实践。
https://software.intel.com/zh-cn/android/articles/unity-optimization-guide-for-x86-android-part-1
为什么虚拟现实计算成本如此高昂?
目前,影响虚拟现实性能的因素主要有 3 个:虚拟现实体验、更新率和多屏幕渲染。有些问题比其他问题更棘手,因此,我们对每个问题进行深入讨论。
虚拟现实体验
每个虚拟现实系统都会进行某种形式的跟踪,Vive*、Rift* 和 PSVR* 建立了跟踪站,可以快速计算玩家在 3D 空间中的位置/旋转和配件,还会在 1/90 秒甚至更短的时间间隔内计算预测信息。例如,如果玩家正在前行,系统预测此人将继续前行,电脑必须计算,但是计算不是免费的。
另一个问题是跟踪速度。每个系统的跟踪速度各不相同,某些系统的扩展性略低,跟踪速度和帧速率之间丢失的数据全部返回预测信息。Vive 基站每 4 毫秒更新一次,Rift 被帧速率锁定,但是不管怎样,如果对象的运动超过一定的速度,而预测无法跟踪对象,对象会在 1/90 秒内被认定为延迟。
在 Vive 中调整图像和复合 chaperone 等也会带来问题。某些系统中,来自 OSVR 的复合占用了所有内核。
开发人员应该怎样做?
就目前来看,能做的不多。许多问题都和虚拟现实硬件密切相关,只有更新了硬件版本才能解决这些问题。我们的长期目标是开发能够自行支持整个体验的头盔。
更新率
现在我们来讨论这个“无足轻重”的问题。多数 AAA 游戏的帧速率在 30 到 60 FPS 之间。运行虚拟现实游戏的帧速率为 90 FPS,高出三分之一。问题不算太严重,是吗?不幸的是,问题要复杂得多。多数系统确实借助二次投影特性来处理偶尔发生的 FPS 故障,但是稍后系统将默认降至下一个帧速率级别。如果您无法提供处理的扩展空间(特别在 Vive 中),应用将完全降至下一个帧速率级别。如果系统长期以低于 90 FPS 的帧速率运行,将会降至 45 FPS 级,只有良好结果达到一定数量,才能重新上调级别。这意味着您的理想帧速率为 100–110 FPS,才能确保当屏幕上出现 45 颗头的反派,而且无法匹配大量的 45 FPS 时,有充足的扩展空间。因此,帧速率必须提高三分之一,对吧?
除此之外,还有一个常被忽略的因素 — 驱动程序计时。在开发人员看来,游戏是技术世界的“洗发露”。数据从 CPU 传输到 GPU,最终在屏幕上显示。经历了类似于涂抹洗发露、冲洗泡沫和反复清洗的过程,游戏便产生了。这些小切换不断累积,最终形成高昂的成本,限制了整个体验。以下链接显示了在优化过程的某个阶段,驱动程序成本占整个体验的 38.5%。
开发人员应该怎样做?
为了提升帧速率,开发人员需要优化平台,优化游戏(我们稍后会介绍)需要良好的性能开销,才能成功创建出色的体验。DX12*、Mantle* 和 Vulcan* 正在率先对抗这个问题,可能为驱动程序带来一些新的可能。希望未来会对特性进行更新,创建新的驱动程序和硬件芯片组。如欲了解更多的优化实践,请访问:
https://www.pcper.com/reviews/Editorial/What-Exactly-Draw-Call-and-What-Can-It-Do
多屏幕渲染
这个问题非常令人头疼。所有虚拟现实头盔均包含多个屏幕,每只眼睛分别对应一个屏幕。其微小的视觉偏移量能带来深浅的错觉,使用户相信他们身处珠穆朗玛峰,而不是穿着短裤坐在伦敦的公寓中。目前,我们为双眼分别连接了两个独立的摄像头,以创造视觉存在感。双摄像头和其它效果(如法线图和基于 sprite 的粒子系统)使需要绘制的对象数量增加了一倍。当然,这并不意味着开销仅为 50%,为了显示纹理,绘制调用渲染摄像头的次数是原来的两倍,这是一个非常庞大的任务。帧速率高于 90 FPS 时,绘制调用增加了一倍,纹理被渲染了两次,而非一次,同时跟踪和管理跟踪开销。真正的问题在于每只眼睛相当于平均尺寸的 1080p 高清屏幕,像素为 2160x1200(每只眼睛 1080x1200)。抗锯齿 (AA) 也给系统带来了繁重的负担。由于虚拟现实游戏必须戴上头盔体验,它们对抗锯齿特性的要求比普通游戏更高。
开发人员应该怎样做?
目前,已经实施了一些新特性,还有一些正在实施。其中,基于性能的屏幕尺寸与 AA 的组合将在所有游戏中实施。这个概念非常易于理解:当游戏出现卡顿时,缩小屏幕尺寸,降低 AA。第二个方法是一秒内多次刷新 GPU,确保 GPU 处理更多的任务。实例化立体渲染选择场景中的某个对象,在 CPU 上针对一只眼睛准备所有信息,打包、转换信息以弥补另一只眼睛,然后进行渲染。请访问以下链接了解该技术:
注视点渲染技术选择和放大用户视线中的重要对象,缩小和虚化不重要的背景图像。这项技术能进一步减少每个头盔向屏幕输出的数据大小。径向密度屏蔽每隔一个像素进行渲染,生成棋盘图像,邻近像素提供缺失像素的相关信息。观看以下视频,Valve 公司的图形工程师 Alex Vlachos 将向您介绍上述话题的更多信息:
http://www.gdcvault.com/play/1023522/Advanced-VR-Rendering
Valve 实验室在针对 Unity* 进行渲染时实施了多项技术,提供了绝佳的项目示例。
未来的解决方案
更高效的软件和硬件
多数开发人员正致力于升级游戏引擎的功能,以充分利用多核 CPU。多线程已在软件应用领域流行了一段时间,但是对于多数游戏平台而言,这是一项新兴技术。当前一代 GPU 已经在 PC 端提升了虚拟现实的性能,但是头盔显示器 (HMD) 制造商可能进一步优化该性能。如今,绝大多数头盔采用了虚拟系统,以导入提供的图像。新一代头盔将拥有独立的处理能力,以处理位置信息和立体渲染,在帧速率较低时进行二次投影。
面向移动市场的优质散热系统
对于当前的移动平台(包括笔记本电脑和小型电脑)而言,CPU 是主要瓶颈。与同类的台式机甚至笔记本电脑相比,这些设备的性能较低,无法充分发挥全部的潜力。到目前为止,手机部件无法满负荷运行(任意时长都不行),面向通话时间、电池使用寿命和部分游戏性能进行了优化。造成了极低的绘制调用数量和顶点数量。
径向密度屏蔽
本方法渲染了相隔的像素,并使用相邻的像素填充缺失的信息。本方法小幅提升了性能(在某些示例中性能提升了高达 10%),发挥了一定的作用。如下所示,如果此方法与注视点渲染相结合,将显著提升性能,同时不影响感知体验。
注视点渲染
如果用户没有关注某个对象,注视点渲染不会对它进行详细渲染。当前版本为固定注视点渲染 (fixed foveated rendering)。放大位于中心的三分之一部分,缩小其余三分之二部分。随后将发布更先进的技术,包括基于感知的注视点渲染和基于目光的注视点渲染。基于感知的注视点渲染根据场景中心的对象的重要程度来确定对象的细节。基于目光的注视点渲染通过视线跟踪渲染重要的区域。上述技术可以结合多种技术,如基于视野的景深和基于视点的细节层次 (LOD)。硬件开发人员在提升设备的计算能力时(如 HMD 制造商示例所示),可以借助该特性避免跟踪的开销成本。
遗憾的是,由于硬件、软件和平台存在限制,这些技术无法满足开发人员的创新需求。在多数情况下,单独使用某个解决方案时会在系统的其他位置引发瓶颈。例如,实例化立体渲染可以使 GPU 工作负载增加至 257%。
其它解决方案可能为存在瓶颈的领域带来性能问题。了解项目的需求非常重要,例如,如果您的应用占用了大量的 CPU 资源,优化 GPU 不仅浪费时间,而且无法发挥应用的最佳性能。
开发人员如何优化项目?
很明显,当前的技术存在不足之处,但是虚拟现实带来的多数问题和电子游戏中的轻微扭曲一样,我们可以利用已知工具来解决这些问题。熟悉移动游戏开发的开发人员可以使用已知的优化技术,如拼合、大规模着色器优化和多数(即使不是全部)纹理的烘焙。即使您有丰富的开发经验,您的项目极有可能是一个 GPU 密集型项目;也就是说,除非开发移动游戏,使用笔记本电脑或小型电脑生成虚拟现实,否则,热量控制会对性能构成重大问题。由于受到 GPU 设计实施方式的限制,除非您拥有极速的 CPU(如第七代智能英特尔® 酷睿™ i7 处理器或更高配置),GPU 将是长期存在的瓶颈。高端的 CPU 提供的计算能力将有助于您最大限度地提升性能,为负担繁重的 GPU 分担部分任务。这是当今游戏开发过程中反复出现的问题:一个 GPU、一个屏幕、延迟渲染和屏幕空间效果。GPU 主要忙于对双眼进行渲染,因此,了解如何优化 GPU 更为重要。由于性能的限制,Oculus 不建议应用全屏效果。
英特尔® 图形性能分析器能帮助您分析项目
评估项目占用的 CPU 或 GPU 资源至关重要。可以使用 英特尔® 图形性能分析器 (GPA)评估项目的状态,该工具在单个程序包内提供性能分析。请访问以下链接,获取该关于工具的更多信息,包括英特尔员工 Seth Schneider 制作的一个视频。
点击此处下载:
https://software.intel.com/zh-cn/gpa
点击此处,了解更多信息
https://www.twitch.tv/intelgamedev/v/89218972
点击此处,了解更多信息
https://software.intel.com/zh-cn/gpa/documentation
多边形数量
问题分析
过去,多边形数量并未给游戏带来任何问题;系统可以毫不费力地处理数百万个三角形。最新版 PC 可以轻松处理数百万个三角形,但是在虚拟现实项目中,熟练的专业人员也很难处理三百万个三角形。多边形数量优化分为两种类型: LOD 版本和原始版本。
如何确定
通常项目本身不受多边形数量的限制。由于填充率、实时光照和着色器复杂度等因素的制约,减少多边形的数量非常有用,上述因素限制了出现在屏幕上的多边形数量。查看屏幕上的超量绘制数量,以了解填充率。如果存在大量的超量绘制, 优化多边形会有所帮助。如果您的项目中存在许多实时光照,每条光线都会对多边形进行单次正向渲染(推荐在虚拟现实中采用该渲染路径)。如果您的项目布景考究,着色器复杂度能显著增加多边形数量,建议您在虚拟现实中使用移动着色器。您需要开动大脑,使游戏变得美观。减少多边形数量可能会轻微降低着色器的质量。
应对措施
如果团队成员能够完成手动操作,请务必选择手动操作。如果您有充足的资金,可以使用 Mixamo 提供的 Simplygon* 或 Decimator*。还可以采用另一项技术快速、批量处理多个资产,根据您的使用案例产生高质量的结果。请记得使用版本控制,这是因为全面优化不适用于全部资产,需要您返回以进行更多优化,消除中心对象的优化。
import pymel.core as pm #lets get all the objects by the type of geometry pm.select(pm.listRelatives(pm.ls(geometry=True), p=True, path=True),r=True) objectsToReduce = pm.ls(sl=True) for objectToReduce in objectsToReduce: pm.select(objectToReduce) pm.polyReduce(percentage=35, version=1)
LOD
问题分析
LOD 带来了几个问题:上文描述的顶点数量受限和绘制调用数量受限。LOD 能够创建存在于背景中的低版本对象,为场景效果带来新的突破。例如,我们的前方有一个长了 45 颗头的怪物不断逼近,背景是一个茶壶。这是一个中心茶壶,一个包含 6 个绘制调用的 2k tri 特写:颜色、法线图、高度图、高光图和烘烤环境光遮蔽。长着 45 颗头的怪物在您面前,茶壶在房间另一头。应该从何处减少细节?从怪物那里着手,对吗?LOD 帮您解决这个问题。
Unity 的图像属性。
如何确定
很明显,LOD 不可能适用于所有场景和对象,使用 LOD 组件有时会影响性能。为了正确使用 LOD,寻找密集对象和拥有许多绘制调用的对象,如包含许多对象的大房间或开放空间。由于人们通常会关注单个对象,如果场景中只包含几个对象,LOD 的效果更加明显。在这种情况下,运行几个绘制调用后使用 LOD 进行优化完全是浪费时间。如果场景又小又挤,也不适合利用 LOD 进行优化;小幅移动便会引起 LOD 的变化。每次变化都会消耗成本,成本会逐次累加,所以,请合理使用 LOD。
应对措施
成功部署的 LOD 任务包含 3 个方面:优化的模型、优化的材料和优化的着色器。我们以细节繁多的特写为例,如分辨率很高的茶壶。使用细节图将显示逼真特写和粗糙特写的区别。PBR 等着色器效果出众,有助于展现主角的奶奶非常喜欢这个茶壶。如果茶壶距离拉远,使用法线图和高度图,并将顶点数量减少 50% 左右。如果茶壶位于房间的另一头,将着色器改为移动,再次降低顶点数量。
import pymel.core as pm #remember to select an object reductionPrecentages = [0,10,20] nameOfLODS = [] selectedObject = pm.ls(sl) for x in range(0,ReductionPrecentages.length): newName = (selectedObject + "_LOD[%s]")%(x) pm.duplicate(newName) pm.parent(selectedObject) pm.polyReduce(percentage=reductionPrecentages[x], version=1)
本脚本更新非常适用于 Unity,甚至可以为您创建 LOD 组件。我们将脚本更改为 for loop,将优化数量设置为变量,并在后缀名称中添加了和 _LOD[variable] 相同的变量。循环您所需的大小列表,通过 FBX 导出,导入 Unity 和 viola,便可成功创建 LOD 组件。
对象数量
问题分析
由于对象数量不包含减少的对象数量,因此,它是优化面临的一个严重问题。请看以下纹理拼合,面向绘制调用而优化也非常重要。
Unity 的图像属性。
如何确定
再次以茶壶为例,我们添加了一整套茶具,因此,需要渲染形状各异的大量对象,每个对象的材料和纹理各不相同。优化这些对象需要使用拼合的不同版本:不通过拼合而结合,通过拼合而结合,以及通过 LOD 拼合进行低级别结合。
不通过拼合而结合的技术意味着能够整合几乎所有的纹理,优化了几项性能。由于该技术将所有要素渲染为单个对象,并将整个茶壶绘制成网格,因此,对降低超量绘制非常有用。
如果虚拟现实游戏中需要结合不同的资产,通过拼合进行结合技术能有效满足该需求,这是因为该技术可以对纹理进行拼合,几乎不耗费成本。对象缺乏特写细节时,可以借助该项技术结合对象。拼合纹理可以显著提升性能,因此,整套茶具是同一个对象,材质完全一样。该技术的主要优势在于只需要 6 个绘制调用,缺点是由于每种材料对应不同的细节图,因此,茶壶或茶具的细节消失了。
通过 LOD 拼合进行低级别结合技术在较低的 LOD 级别上整合不同对象,保持材料的多样性,同时增加了成本。该技术保留了资产的众多细节,同时支持在茶具的整合版本和原始版本之间进行快速的资产转换。如需捡起茶具,该技术能发挥极大的作用。
应对措施
结合的方法非常简单,只需在 Unity 中运行以下脚本,脚本来自面向 Mesh.CombineMeshes 的 Unity 文档。
using UnityEngine; using System.Collections; [RequireComponent(typeof(MeshFilter))] [RequireComponent(typeof(MeshRenderer))] public class ExampleClass :MonoBehaviour { void Start() { MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>(); CombineInstance[] combine = new CombineInstance[meshFilters.Length]; int i = 0; while (i < meshFilters.Length) { combine[i].mesh = meshFilters[i].sharedMesh; combine[i].transform = meshFilters[i].transform.localToWorldMatrix; meshFilters[i].gameObject.active = false; i++; } transform.GetComponent<MeshFilter>().mesh = new Mesh(); transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine); transform.gameObject.active = true; } }
由于通过拼合进行结合的方法耗时很长,建议您使用 Mesh Baker*,可以为您节省数小时的时间。如欲在 LOD 中应用长时间结合和拼合,建议使用 Mesh Baker LOD。请访问以下链接,了解更多信息。
https://www.assetstore.unity3d.com/en/#!/content/5017
https://www.assetstore.unity3d.com/en/#!/content/12276
如果您想创建最高级的技术,同时保持最强的控制,需要加倍发挥您的创造力。理念是在每个对象的每个独立模型中导出 LOD。利用 Mesh Baker 将最高分辨率的网格结合在一起,无需整合它们的纹理。为了优化移除某些纹理后,利用 Mesh Baker 优化中等分辨率网格。对于最低分辨率网格,将所有着色器降至最低,然后开始整合。技术越先进,耗费的时间越多,但是能节约大量计算。
绘制调用
问题分析
绘制调用(或更为重要的 set pass)是数据从管道一端传输到另一端的成本。简而言之,set pass 指的是一个从 CPU 传递至驱动程序,最终到达 GPU 的数据集。set pass 的数量越少,复杂度越低越好。优化 set pass 的最简单的方法是优化不同的材料、拼合纹理,减少二级纹理的使用,如高度图、法线图和镜面反射度。我之前已经简单提到了 set pass 的优化方法,下面将详细介绍。
如何确定
寻找共享同一个着色器的对象,这种对象的优化效果最理想。在本示例中,整套茶具使用了同一个着色器。然后查看二级图,确定细节繁多的对象,如茶壶。我们没有办法一直优化中心对象,但是最好密切关注,以免它耗尽全部资源。最终,如果对象使用较小的纹理,将它们整合为一个大型纹理,效果将会非常显著。结合我们的示例,思考每个盘子拥有不同的纹理。将纹理整合到一个图集会减少绘制调用的数量。
应对措施
如果对象的着色器高度相似,几乎无法通过肉眼察觉到差别的话,通过更改、匹配它们的着色器,可以结合不同的对象。如果对象距离较远,而且不可用,保留微小细节将造成资源浪费。如果从来没有戴上头盔查看资产,虚拟现实游戏中可能存在过多细节,这些细节通常会导致画面模糊,无法观看。
因此,戴上头盔体验游戏效果非常重要。请记住,早期发现的资产可能占用了大量资源。如果资产不够明显,将它删除;如果资产可见,尝试整合纹理。尽管转换会消耗更多的硬盘空间和 RAM,但是就算没有填满整个图集,也值得尝试。将纹理拼合为一种材料(未整合网格)确保更灵活地设置细节。
另一个方法是创建一个高度混合的自定义 LOD 系统,该系统中的对象可以独立运动,到达一定的距离后,整合成一个对象,然后由 LOD 系统接管。请注意,您的结果可能有所不同,整合后的性能可能低于独立运行的性能,在受到填充限制且 CPU 空间充足的情况下,可以采用该方法。
纹理整合是一个众所周知但不受重视的方法,该方法和拼合不同,它是将灰度图像的纹理整合为单一颜色的图像。例如,茶壶包含 AO 图、高光图和高度图。如果将 AO 置于红色通道,高光图置于绿色通道,高度图置于蓝色通道,可以利用一个绘制调用将它们整合在一起。现在,您必须确保着色器相互匹配,这是低级别优化的关键。
- 选择层。
- 进入通道。
- 删除绿色和蓝色的通道,生成一个纯红色通道。
- 返回层对话框,重复上述操作,创建一条绿色通道。
- 再次重复上述操作,创建一条蓝色通道。
- 尽情创建吧!
Gimp 团队的图像属性。
烘焙灯光和环境光遮蔽
问题分析
我们已经看到,虚拟现实中所有的计算都需要进行预计算。维持游戏的运行几乎耗费了一个 CPU 内核,GPU 利用空闲时间加速,同时处理两个游戏。这意味着您必须尽力烘焙。几乎不可能实现实时全局照明,实时照明会让您立即陷入麻烦。
如何确定
几乎所有对象都需要光照贴图,不需要光照贴图的对象接收实时阴影,不一定必须是阴影。参阅下文了解更多信息。查看 Valve 实验室的渲染,以了解如何在场景中使用灯光。
应对
我们要完成几项任务,首先,烘焙所有照明。遗憾的是,在最新版 Unity 光照贴图中,如果屏幕较大且流程没有成功的话,烘焙十分困难。建议您将全部资产导出到数字内容制作程序,如 Maya*,然后烘焙您的背景图和环境光遮蔽。创建优质的光照贴图不在本文的讨论范围内。以下是 Maya 提供的 Turtle* 知识库,也是我的个人最爱,下面的是 Substance* 提供的环境光遮蔽知识库。
Autodesk 的图像属性。
Allegorithmic 的图像属性。
https://support.allegorithmic.com/documentation/display/SPDOC/Baking
缺点是还需要创建着色器以提供支持,但是 Valve 着色器的快速组装能为您节省不少时间,实现了着色器的最佳优化。
实时光照阴影完全不需要阴影,只需利用光照方向在地面投射虚假阴影,这些阴影无非是拼合而成的动画纹理(与角色动画相匹配),或者利用更简单的技术创建能调节角度的老式 blob 阴影。让人惊讶的是,几乎没有人会察觉。
着色器
问题分析
对于优化而言,着色器是“万恶之源”。很少有人会编写着色器,引擎自带的着色器一般不包含应用优化。最好的办法是使用着色器的移动版本或想办法创建着色器。
如何确定
如果着色器包含 4 个以上插槽,而且您创建的对象不是中心对象,着色器可能没有面向您的应用而优化。对于虚拟现实中的非中心对象,颜色、法线图、闭塞和光照贴图是必不可少的。
应对措施
您可以利用着色器的移动版本进行优化,但是最好的方法是学会编写着色器。其实没有那么难学,您的成果会证明付出都是值得的。
遮挡剔除
问题分析
您可能不知道在 Unity 游戏中,剔除在默认情况下开启,视锥剔除将剔除摄像头视锥视线以外的全部对象。下一步使用遮挡剔除,以茶具为例,如果茶壶在银器的前方,打开遮挡剔除后禁止绘制银器,这个功能非常实用。
如何确定
该技术适用于封闭区域,如房屋或建筑物内,但是如果您身处开放区域,对象之间有重叠,使用该工具会降低性能。
应对措施
就开销而言,遮挡剔除有利也有弊。我认为,对于摄像头查看的无关事物,无需担心剔除。例如,在一栋房子里,您站在车库向厨房张望。桌子上有一套茶具,您和茶具之间隔着一堵墙。游戏通常会渲染茶具,由于墙的阻隔而丢弃渲染。应用遮挡剔除后,生成预计算网格,能感知视线范围内的全部对象。摄像头发送射线以检测能看到的事物,碰到边界后,便不会对视线外的对象进行渲染。建议您在标准设置下尝试该技术,查看是否有用,标准设置的速度非常快;如果并非如此,设置为渲染,然后就可以去忙别的事情了。如果您已经看到了改观,开始测量并计算所有对象的实际大小。
最后一项新技术
混合 mono 渲染是一项新技术,可以立即添加该技术。基本理念是对近距离的对象进行立体渲染,远距离的对象只渲染一次。
https://developer.oculus.com/blog/hybrid-mono-rendering-in-ue4-and-unity/
结论
希望本文能为您带来关于开发虚拟现实这一全新平台的新想法。
在 Unity 中进一步优化虚拟现实
https://unity3d.com/learn/tutorials/topics/virtual-reality/optimisation-vr-unity
在 Unreal* 中进一步优化虚拟现实
https://developer.oculus.com/blog/introducing-the-oculus-unreal-renderer/
非常感谢英特尔创新者计划对本文的支持,在创新者计划的帮助下,我们致力于改善最佳实践。
关于作者
Tim Porter 是 Underminer 工作室的虚拟现实和 PC 图形开发人员。他的技术美工背景有助于统筹优化全局,他在前沿图形技术积累的丰富经验使他掌握了大量的方法和技巧,与大家一起分享。请发送邮件至 Tim@UndeminerStudios.com,与他取得联系。