看来大多数人对其工作方式的直观理解与它实际和需要的工作方式是相反的。由于游戏音频界想进一步了解这一主题的呼声高得出乎意料,我写下这篇开发者技术博客,为分屏音频在虚幻引擎中的工作方式做一个基本讲解。
分屏游戏的背景
分屏游戏最近在游戏界多少有些复兴的趋势。在多人游戏的发展初期,游戏主机还不支持联网的年代,它曾经红极一时。我少年时代最美好的回忆就包括在朋友家里过夜,和他们一起边吃披萨边玩《黄金眼》和《光环》之类的分屏游戏。后来,在第一批提供宽带互联网支持的游戏主机出现后,我们就看到了分屏支持的缓慢衰落。如今它又在缓慢回潮。人们既喜欢联网玩游戏,*也*喜欢和朋友面对面共享游戏的快乐。好在虚幻引擎支持多达四路的分屏模式。许多游戏同时支持本地“沙发”合作和远程联机。我们在《堡垒之夜》中也是这么做的。你可以把朋友叫到家里,共享一台主机,也可以连上网络,和世界各地的其他好友一起游玩。
要在虚幻引擎中启用分屏,你只需要在“本地多人游戏(Local Multiplayer)”设置选项卡中启用该选项,然后选择你需要的分屏模式即可。你还可以使用C++ API自定义,实现更多功能。
分屏游戏的挑战
启用分屏毕竟没有那么简单,不是切换一个游戏项目选项就能期待最好结果的。在场景中添加更多视角会导致有更多对象需要渲染,还会减少剔除的机会。这也意味着有更多东西会被占用和加载,从而被垃圾回收器引用。所有这些附加工作几乎会给游戏引擎中的每个子系统都带来巨大压力。在音频方面,也会产生有趣的问题。

直觉不一定是对的
从我与开发者同事的对话来看,大多数人似乎都有这样的直觉:每个分屏视角应该对每个玩家(也就是“听者”)渲染出所有可以听到的音频。这种想法确实很有道理:如果在1号玩家附近有一支枪开火,那么1号玩家就应该听到从附近传来的枪声。但是对远处2号玩家的视角而言,枪声应该像是从远方传来的!毕竟听觉是无法拆分的。我们应该听到两个视角下的所有音频,对吗?错了。且不说增加一倍的音频渲染CPU开销(对两路分屏而言),这种处理方式会引发无穷无尽的听觉灾难。想想看吧:屏幕上发生在所有玩家听觉范围内的每一个事件都要因为两路分屏而翻倍。如果是三路或四路分屏,可能要增加到四倍!当一个脚步声响起……那听起来就像有一队人在踏步。如果对每个听者来说,脚步声是同时响起的(确实会这样),而且它们播放的脚步声变化也相同,那么你就会因为这些相同声音的叠加而突然听到非常响的音频。你甚至有可能被震得耳朵疼。想想战场会有多混乱吧。每一声枪响都是同时从所有视角渲染和发出的。
那么,正确的做法是什么?很简单:只对距离最近的听者渲染一次声音。
虚幻引擎如何处理分屏
虚幻引擎的解决方法很巧妙。它的实现策略在我出生前就有了,但是当我五年前加入Epic时,还是为这个简单而巧妙的解决办法折服。虽然它的原理和我在别处见到的方法很相似,但UE4的解决方案特别巧妙。基本上虚幻引擎做的事就是把每个声音发射器位置变换到离它最近的听者的本地空间变换中。这不仅简化了大量较低级别的细节,还意味着较低级别的音频渲染器只需要关心一个听者变换。事实上,因为这种简化,混音器(这是我们新的多平台音频渲染器)不需要任何听者几何体表示。因为所有的声音发射器都会在发射到音频渲染器前变换到本地空间变换中,所以所有的声音都是相对于一个单位矩阵空间化渲染的。这种简化降低了我们的空间化代码的复杂度,而且大大有利于简化我们更激动人心的次世代空间化功能的开发工作。
缺点
仅对距离最近的听者渲染声音的做法虽然反直觉,却很有道理,不过它也有一些缺点,比如:- 对视角帮助不是很大
很显然,在一个分屏玩家附近打出的一枪可能根本不是冲着离得最近的听者来的,而是瞄准离得最远的分屏玩家。所以,你可能会觉得应该优先针对离得比较远的玩家播放声音。但问题是,这样的音频提示可能令遭到枪击的玩家感到困惑!然而,正如我指出的,另一种选择问题更大。
- 传播中声音会转换视角
持续时间很长或者循环播放的声音可能会长到从一个听者视角转换到另一个。这种转换可能听起来很刺耳。最糟糕的情况(也是我们进行了大量测试的情况)就是两个玩家/听者面朝同一方向,但是互相隔开合理的距离,然后有声音从一个玩家那里传到另一个玩家。在半路上,原本听起来是在一个玩家身前的声音会变得像是在另一个玩家的身后。它“唰”一下就从前面转到后面,这可不好。
- 渲染较多声音可能会改变混音和优先级均衡
任何声音设计师都能证明,获得均衡的游戏混音绝非易事。为游戏提供同时适用于单屏和分屏模式的均衡混音更是难上加难。
- 附加的声音和CPU开销
虽然只渲染一次音频(相对于最近的听者)的开销要比分别为每个听者渲染音频低得多,但还是会增加CPU成本。这是因为我们有更多音频在“范围内”,毕竟渲染范围内的声音时要考虑两个位置。对于《堡垒之夜》这样每两周就要挑战一次CPU和内存极限的游戏,这可不是小问题。
多个端点
你们中间的高手可能想问把音频渲染到不同音频端点的问题,这意味着需要另一路硬件输出(例如另一组扬声器或不同的控制器,等等)。有些游戏主机确实支持这一功能,在PC上也可以把音频渲染到不同端点。这里的思路是,你确实可以为每个分屏视角渲染音频,并路由到不同的硬件输出,有可能让玩家通过耳机听到。
尽管如此,到4.24版为止,UE音频引擎都不支持这种功能(截至本文写作时,不过我们计划在4.25版中支持它)。而且它也不会同等支持所有平台。因此,即使你想要减少各种附加音频渲染的CPU开销,在没有渲染到多个硬件端点的功能的情况下,你很可能还是需要替代解决方案。而且我觉得,如果你请朋友来家里,和你一起坐在沙发上用分屏模式合作,却突然戴上耳机不说话,实在是很滑稽的事,不过这只是我的个人想法!
总结
所以说,处理音频分屏确实可以很复杂,是个包含大量技术细节的棘手话题。但是,有一个反直觉的思路是,如果你只对离得最近的听者(也就是分屏的近视图)渲染音频,那么就能合理地解决一切问题。要了解关于这个话题的更多信息,请看我在即将出版的系列丛书《Game Audio Programming Principles and Practices》(Guy Somberg编辑)第三卷中针对该主题写的章节。