Oculus Quest最佳开发实践:如何避免图形管道瓶颈
查看引用和消息源请点击:映维网
最佳开发实践和Quest商店方针
(映维网 2019年05月04日)克里斯·普鲁厄特(Chris Pruett)是Oculus内容生态系统的负责人。他曾在今年三月举行的GDC大会发表了名为“Down the Rabbit Hole with Oculus Quest”的主题演讲,从开发商的角度简单概述了Oculus Quest。
现在,普鲁厄特正通过两篇博文回顾介绍当时的演讲。昨天的博文与硬件/软件方面有关,而今天普鲁厄特则分享了与最佳开发实践和Quest商店方针的讯息。下面是映维网的具体整理:
1. 最佳开发实践
确定Quest的图形架构与PC视频卡的区别非常重要。Quest的大多数性能优化都是关于合理地格式化美术asset,而非编写更快的代码。所以,明确如何避免图形管道中的瓶颈十分关键。
在CPU方面,绘制调用是计算开销的常见来源。绘制调用这个命令主要用于绘制带有状态包的网格:网格,着色器,通常包含一定的纹理,以及任何需要绘制的其他数据。CPU的图形驱动程序必须为GPU的每次调用做好准备,而这种准备需要时间。最基本的优化之一是,减少绘制场景所需的绘制调用总数。
绘制调用值得我们深入探讨。绘制调用的关键一点是,它们在成本方面可能存在非常大差异。一些绘制调用的成本很低,另一些则很高。实际的计算开销来源并非绘制调用本身,而是绘制调用之间的状态更改。如果你反复使用相同的纹理和相同的着色器来绘制相同的对象,你会发现第一次调用的成本会很高,但所有后续调用的成本则很低,这是因为驱动程序缓存并重用了绘制网格所需的状态(着色器和纹理)。只有第一个调用会调用大量数据,后续调用只是重用已经准备好的数据。所以,优化的重点不是减少场景中绘制调用的总数,而是考虑每帧所需的状态更改总数。
假如场景中有10个对象,每个对象都有不同的纹理,则每个对象都需要包含单独数据集的单独绘制调用。不同的网格,不同的纹理,不同的着色器参数,甚至可能是不同的着色器。但如果将所有这些对象组合成单个纹理(“纹理图集”),并将对象的UV映射调整为指向单个纹理,则绘制调用的开销会降低,因为纹理只需要绑定一次就可绘制所有10个对象。如果你可以进一步使用相同的着色器和着色器参数,则可以显著降低场景的成本。例如对于Unity开发者来说,你可以使用相同的材质,为所有对象使用相同的着色器和相同的纹理。如果你可以它们标记为“批处理静态”,则甚至可以对所有对象使用相同的网格。下图概述了不同类型的绘制调用状态更改的相对成本(柱形越高,表示执行绘制调用所花费的时间越高):
我们从开发者的举措中看到了一些常见的,能够有效减少绘制调用和状态改动开销的方法,例如使用烘培照明,以及对环境网络使用智能静态批量处理等等。下面是《Dead and Buried》中的一个示例场景。开发者是从美术asset方面着手优化,并在Quest实现了优秀的运行效果:
至于GPU,Adreno 540的Binning架构的主要优势包括,4X MSAA的成本是每帧1.25 ms和1.54 ms之间,具体取决于片段着色器的复杂程度。为了最大限度地提高GPU的性能,你需要明白系统在处理全屏效果之前需要解析整个场景,所以这样做的成本非常昂贵。其他类型的相关渲染亦是如此,如实时镜像和反射。最后,在片段着色器中丢弃片段(如通过discard()或clip())会致使GPU重新渲染整个图块,所以你应该在所有着色器中避免使用。
由于Quest游戏渲染的分辨率非常高,所以即便是没有复杂片段着色器的场景,片段都有可能成为约束限制。最常见的“罪魁祸首”是彼此重叠的大型透明对象,并且最终在同一帧中多次触及相同的像素。例如,如果四边形具有显著重叠,同时导致大量像素被多次混合,这时在整个眼睛缓冲区中绘制大型透明四边形的粒子效果的成本可能要比预期昂贵。固定注视点渲染同样可以帮助降低帧的整体片段成本。
需要注意的是,增强眼睛纹理分辨率的成本同样非常昂贵,但这可以产生非常优秀的结果。如果你发现GPU不是瓶颈所在,请尝试增加眼睛纹理分辨率。
Quest游戏可以很大,但包含它们的数据需要以一种特别的方式进行组织。我们推荐的可APK文件为小于1GB,理想是小于100mb,同时可包括一个或多个扩展文件。扩展文件最大可以为4GB,并且可以是任何格式。对于Unity,你可以将所有场景放到Chunk-Compressed Asset Bundle。这可以帮助你轻松生成扩展文件,但同时会提高加载时间。Quest app可以是32位或64位,但我们推荐64位,这是为了减少内存碎片化,提升性能,减少加载时间,并且支持加载更大的扩展文件。
尽管Oculus Quest尚未发货,但我们已经看到VR一体机领域出现了全新的游戏设计模式。例如,Quest可以提升基于头部的导航,因为玩家可以自由地360度转动,无需担心线缆缠绕。尽管我们仍然推荐诸如瞬转等解决方案(考虑到玩家有可能是坐在旋转椅上,并且难以轻松转动),但在一个环境中打转时,单纯依靠基于头部的导航感觉效果非常出色。
另一个有趣的示例是重新居中。对于Rift,你可以简单地将面向追踪器的方向作为“正向”。但Quest没有明显的“正向”。当玩家需要重新对齐虚拟世界和现实世界时,你在旋转两者时没有标准的正向作为参考。SUPERHOT Team采取了一种有趣的解决方案,而我们在OC5大会已经用Quest进行过演示。在演示内容中,在每个关卡的最后你都要摧毁一个旋转的锥体,只有这样你才可以继续前进。如果离锥体太远,玩家必须走到它附近的有效攻击距离,然后再将其摧毁。SUPERHOT Team确保这个锥体总是在真实世界游玩区域的正中心生成,从而迫使玩家回到游玩区域的中心,然后再加载下一个关卡。通过这样的方式,游戏开发团队可以确保玩家不会在一个尴尬的位置开始新的一关,比方说刚好对着一堵墙。
2. 商店和生态系统
你必须认真阅读我们今年年初为Oculus Quest宣布的Concept Approval Process(概念审核流程)。简单来说,我们要求开发者在开发流程的初期就向我们提交一个概念文档。我们的目标是支持看起来适合Quest用户的内容,并且确保你无需为最终可能不适合平台的概念投入大量的成本和时间。通过审核的作品可以获取我们提供的开发者支持和资源。这个流程只针对Oculus Quest,不包括Oculus Go或Oculus Rift。
延伸阅读:Quest应用提交常见问题
对于这个流程,我希望强调的一点是,我们正在物色精良有趣的高质量作品,包括只是针对利基用户的体验。利基的,奇怪的,实验性的,只要是精良有趣,通通都可以。但是,我们希望它们可以与平台的所有其他作品一样,能够满足用户对质量方面的期望。我们不需要技术演示内容或“周末实验”。
Oculus Quest将于5月21日开始发货,售价399美元。我们提供了大约50款首发内容,而更多的作品将陆续与大家见面。