撰写了文章 更新于 2017-12-15 18:06:01
【弹幕程序科普计划】 第八篇 音效播放
【音效播放】
声音是游戏中一个很重要的环节。背景音乐和音效虽然都是声音,但是两者还是存在很大差异。背景音乐在同一时间只需要播放一段曲子,而音效可能会同时播放数个音效,并且播放频率会非常频繁。因此,通常背景音乐文件可能会有mp3、ogg等多种可用格式,而音效往往直接使用wav文件,来避免解码过程带来的时间损耗。此外,播放音效时,通常将音效文件加载后保留在内存中,避免频繁加载文件。
不知道你是否有这样有一个概念,无论使用什么游戏引擎或者编程工具去播放音频,总有一个类似于播放器的东西。对于一个播放器在同一时间只能播放一个音频文件。
这里扯一句题外话,做游戏时很多事情看起来很简单,但实际上细节无数,无论写弹幕引擎还是什么其他游戏。比如说对于音频播放这个问题,可能大多数人觉得,就是把一个音频文件播放出来的事情,无论游戏引擎还是DirectSound之类的封装库,只要学会使用其中的播放工具就好了。但实际情况是怎样呢,我们不妨先来思考一下以下这些问题。
1 当一个敌机爆炸音效尚未播放完时,又一个敌机爆炸,新的爆炸音效是否打断上一个爆炸音效?
2 自机连续发弹时,下一个发弹音效是否打断上一个发弹音效?
3 自机发弹音效、爆炸音效是否打断敌机的发弹音效和爆炸音效?
4 当有复数敌机同时爆炸时,播放1个音效还是复数个音效?
5 当使用立体声时(根据发声点位于屏幕和横坐标位置控制左右声道的音量),如果复数个敌机同时爆炸,发声点怎么确定?
先来回答问题4:当有复数敌机同时爆炸时,播放1个音效还是复数个音效?
首先,基于每个播放器同一时间只能播放一个音效,如果有1000个敌机同时爆炸,如果放1000个音效的话,需要1000个播放器,这个开销显然不科学,而且这些播放器音量会叠加。所以,复数个敌机爆炸时,应该只放一个音效。
问题3:自机发弹音效、爆炸音效是否打断敌机的发弹音效和爆炸音效?
这显然不会打断。
问题2:自机连续发弹时,下一个发弹音效是否打断上一个发弹音效?
认真观察东方原作的朋友应该知道,是打断的。
问题1:当一个敌机爆炸音效尚未播放完时,又一个敌机爆炸,新的爆炸音效是否打断上一个爆炸音效?
从播放效果上讲,打不打断都可以,但是出于和问题4一样的考虑,减少播放器数量,所以应该打断。
问题5:当使用立体声时,如果复数个敌机同时爆炸,发声点怎么确定?
基于问题4,由于复数敌机爆炸时只是用一个播放器,所以如果要使用立体声的话,需要自己根据敌机位置来计算发声点,可以使用加权平均。不过这样可能还是会有一些缺陷,如果真的要达到非常好的立体声效果,可能需要专门的立体声工具,比如X3DAudio或者Unity3D中的立体声工具,设置发声源位置和监听位置。我对此也没什么研究,这里就不展开了。
综上所述,在弹幕游戏中音频播放究竟应该是一个什么样的架构,这里就长话短说了,直接给一个结论性的东西:
◆对每一种音效分别建立一个播放器并保留在内存中,这样不同的音效不会相互影响、相互打断,而相同的音效会打断自己;
◆ 在关卡脚本运行过程中,或者说在自机、敌机、Boss的控制过程中,不直接进行音效播放,而是将要播放的音效添加到播放列表中,待全部添加完后,对播放列表去重,然后根据去重后的列表选择相应的音频播放器进行播放;
◆ 如果要使用立体声,则在对播放列表去重的同时计算发声位置。
那么本次科普就到这里。