《Ninja Legends》分享:如何为快节奏VR动作游戏的交互优化性能
开发者视角
(映维网 2019年10月25日)日前,VR动作游戏《Ninja Legends》的开发商Coinflip Studios通过博文介绍了如何为快节奏的交互优化性能。下面是映维网的具体整理:
我们游戏最令人满意的一个地方是将敌人砍开一半的时间点。当出现这个情况的时候,敌人角色会沿着剑刃移动所创建的平面动态分成两半。CPU和GPU实时拆分敌方忍者可能需要非常昂贵的成本。尽管这对于大多数现代游戏PC而言通常都不是问题,但要Oculus Quest的移动芯片组平稳运行则复杂得多。在本文中,我们将介绍在为支持设备保持平稳帧率而在CPU端使用的技术。
我们的解决方案把目光放在三个方面:
- 确保网格划分算法具有足够的CPU周期以平稳运行。
- 管理切割产生的大量视觉效果。
- 保持切割后的性能稳定。
1. 后台线程
拆分敌方角色网格是一项非常简单的操作,现计算出哪个边缘位于刀刃的哪一侧,然后生成具有正确边缘的新网格。这包含大量简单的数学运算,因此非常容易将其卸载到后台工作线程。通过将所述计算放在后台线程,我们减少了主CPU线程的负担。
使用后台线程的一个缺点是,你不能再保证操作能够在一帧内完成。多线程编程的异步性质意味着你可能需要花费两帧或以上才能在后台完成工作并将数据返回主线程。需要记住的另一件事情是,并不是所有的工作都可以在后台线程完成。会影响3D场景本身的操作必须由主线程执行。
2. CPU调频
Oculus Quest OS允许设备动态地提高和降低CPU和GPU的性能。我们将重点放在CPU方面,但GPU存在类似的行为。通过尽可能调低CPU的频率,头显可以节省电能并防止过热。设备将自动检测游戏当前的CPU是否资源紧张,并适当地提高CPU级别。将决定权留给设备的问题是,增加CPU级别的决定需要耗费数帧。
在CPU调高频率之前所需的决策时间表示游戏存在潜在的帧率下降。由于我们知道切割会对CPU造成压力,所以每当我们检测到玩家要切割敌人时,我们手动提高CPU的速度。我们最大化CPU级别半秒钟,然后允许默认行为接管并自然降低CPU级别。
在Unity Oculus SDK中,这个控件通过OVRManager.cpuLevel公开。
3. 用于视觉效果的对象池(Object Pooling)
当玩家执行切割时,这瞬间会触发大量的视觉效果。多种效果共同作用,为玩家创造了令人满意的反馈时刻。问题是,立即实例化大量的效果是成本十分高昂的操作。我们发现每个效果的实例化时间超过1毫秒。对于72 fps(每帧13毫秒),这大约相当于该帧CPU时间的10%。在《Ninja Legends》中,我们通过应用对象池来缓解问题:在场景中维护一组常用的效果,所述效果已经实例化,但一直隐藏到需要时为止。
4. 跨帧视觉效果激活
即使应用对象池,重新激活同一帧中的多个对象会产生一定的成本。我们的解决方案是将进行跨帧视觉效果激活。我们构建了一个系统,排队低优先级的激活,并每帧分配一个激活。1帧启用5种效果可能会超出预算,但将同一种效果顺延用于5帧所产生的影响则要小得多。请记住,以72 fps播放5帧大约需要70毫秒,玩家依然会立即看到它。
5. 减少物理交互
游戏的物理模拟由CPU运行,所以降低模拟的复杂性可为我们提供更多的性能空间。一旦切割敌方忍者,我们只允许物理碰撞器与地面交互。身体部位 vs 身体部位,身体部位 vs 其他敌人,以及身体部位 vs 玩家武器之间的交互不再需要,而且如果保持激活状态,这实际会引起更多不必要的视觉噪点。这使得我们可以在切割后保持平稳的帧速率。这十分重要,因为玩家可能会陷入激烈的战斗状态,存在多个敌人,并且四面八方地触觉视觉效果。
下面是我们的Unity Phusics碰撞矩阵。切割的敌人分配到Chopped图层,而后者与Environment图层没有任何冲突。
6. 结论
利用所述的技术,我们为Oculus Quest开发了一种终极的忍者体验。尽管这经历了多次的技术与设计迭代,但玩家的积极反馈令这一切都是值得的。