大佬们如何解决在短时间内多次播放重复音效会出现的破音问题



  • 就比如单位被攻击播放受击音效,当十几个单位同时被打导致受击音效同时播放十几次造成音量爆炸破音该怎么解决呀?



  • @烂鱼冉遗 限制同时播放呗
    比如 播放音效前先停止同个音效的播放;或播放新音效时如果正在播放同音效则不播放新音效。
    针对你游戏的情况 多个单位被攻击的话 给玩家的感觉肯定是要比单个单位被攻击所听到的声音音量更大,建议就是适当的允许几个声音同时播放 如果再出现多的同个音效 可以先停止前面的音效。
    (只是思路 你可以尝试用条件做一下)



  • @烂鱼冉遗 这是一个好的设计问题,解决方案取决于你的游戏类型、节奏和风格。
    首先,如果仔细观察,很多游戏的默认音量设定是在50%左右,这一点可以考虑加入到你的游戏里,以快速避免一些小的削波(削波是输入音量大于输出允许值时发生的“破音”现象);但是很明显,这样是治标不治本的。
    然后,如果你的游戏是敌方单位数量较多、节奏较快的类型(例如具有大量弹幕,或者类似吸血鬼幸存者那种),则应该把音效时间缩短,同时考虑使用压缩器(compressor)调整声音,使其在响度相同的情况下降低电平(电平过载是导致削波的原因,但响度与电平不是完全相关的)。
    最后,如果说要一个终极解决方法,通常来说就是写一个良好的声音引擎代码、限制同时播放的音效数量了;可以使用一个数组追踪所有正在播放的音频,然后在超过上限时停止最早播放的内容,这样可以完全解决这个问题。



  • @zjxdiu 大佬这个操作在引擎内要怎么实现呀,能不能给个简易的代码参考,音效代码我懂得实在不够多😭



  • @烂鱼冉遗 花了几个小时写了一个符合我思路的事件,需要的话可以参考。
    首先说明一下,这些代码我自己完全没有测试过,不保证可用性;但按我的理解来说应该可行,最多就是推出可能需要换成删除、数组写入后需要等待0秒防止异步问题之类的。

    先来看一下系统设计思路:
    undefined

    左边是音效播放结束检测,右边是需要播放新音效时的流程。

    然后,首先写音效主体动作组:
    undefined

    这个动作组对于队列已满的处理是调用另一个动作组,所以写这个:
    undefined

    然后处理已播放完的音频:
    undefined

    这样整个系统的功能基本上就完成了,当然我自己能看出来一种问题,就是如果同一帧里刚好出现音频播放结束和需要播放新音频的事件时,可能会导致数组长度变化(也是异步导致的问题);如果真的有这个现象,可以在每0.3秒的检查里加一个数组宽度的检查,如果超出设定值则重置宽度。


    场景初始化需要单独的事件:
    undefined



  • bug?,,,,,,,,,,



  • @zjxdiu 谢谢大佬解答,这样果然有效缓解爆音问题👍 😘


登录后回复