如果我发错地方了,请见谅。
正如标题所述,我正在使用 Cutievirus 的 MV3D 插件和 Quxios 的 QAudio 插件。基本上,我想在项目中实现基于距离的声音效果。最终我选择了 QAudio,因为其他人 制作了一个能与 MV3D 配合使用的版本。
起初几秒钟,它按我的预期运行。随后音频变得卡顿,接着测试游戏崩溃了。我尝试查看控制台以获取完整错误信息,但测试游戏在显示之前就已经崩溃了。
我成功截取了弹出的错误信息;它显示:
Uncaught (in promise) DOMException: unable to decode audio data.
我不确定这是否是真正的问题,但这是测试游戏崩溃前显示的内容。所以我考虑了几种解决方案:
进入插件代码,看看能否修复或编辑它(这可能是最糟糕的选项)
尝试查看地图上的某些元素是否导致问题
尝试寻找其他插件(
跳过使用插件,尝试通过变量和区域 ID 手动实现基于距离的声音效果
完全跳过基于距离的声音系统
委托他人开发一个能与 MV3D 配合使用的插件
在此之前,我还尝试过几件事,例如:
使用原始未修改的插件。测试游戏仍然崩溃。我甚至修改了插件命令以确保无误。
更改音频文件。结果依然是声音卡顿直到停止播放,但测试游戏没有崩溃,因此插件可能不是唯一的问题所在。
这可能希望渺茫,但任何帮助都将不胜感激。
感谢您的时间。
Baz
2026 年8 月 20 日 01:17
4
我没有 MV3D,因此无法复现上述任何情况,但我查看了 Quasi Audio,发现其中有一些值得在修改插件之前排除的问题。
该插件故意覆盖了 MV 的 createNewBuffer 方法,使其不进行缓存,文件中的注释解释了原因:为了让同一个音频文件能够同时播放多次。代价是每次 qaudio play 都会构建一个新的 WebAudio,这意味着另一次获取请求和另一次解码。没有任何内容会被复用。
那么,你是如何触发播放命令的?如果是通过并行进程或某种会重复触发的机制,它会不断发起新的解码请求,这可能与你的观察相符:起初正常,随后因堆积而变得卡顿,最后因无法跟上节奏而出现解码错误。
如果你使用固定的 ID(如 1),插件会找到具有该 ID 的先前缓冲区,停止并清除它,因此同一时间只有一个缓冲区处于活动状态。而使用 * 时,每次调用都会生成一个新的唯一 ID,因此没有任何匹配项,每个缓冲区都会保留下来,并在每一帧中更新。
如果情况确实如此,修复措施应在事件层面进行,而不是在插件内部,这将是一个更好的结果。也许值得发布运行 qaudio 命令的事件。
还有一件值得单独检查的事情:你使用的是哪个版本的 MV3D?你链接的帖子来自 2020 年 1 月,当时 MV3D 是 0.4.x 版本,而现在已经是 0.9.x 版本了,因此当时的修改可能是针对与你当前运行的插件大不相同的旧版插件。
所以我将触发方式从并行进程改为了自动运行(Autorun)+ 自变量开关(Self Switch),我认为这解决了问题。到目前为止,测试运行没有崩溃。
不过,如果放在并行进程中,音频会保持循环播放,但循环命令使其变得多余,我应该很快就能意识到这一点。至少我现在知道了。
当有更多音频事件加入时,我可能会有所担忧,但目前看来问题已经解决。
是的,我使用的是 0.9.x 版本。我认为更新不会对其他插件产生太大影响,因为 MV3D 的代码没有发生足以导致问题的变更。
Baz
2026 年8 月 27 日 00:04
6
太好了,很高兴问题解决了。
关于担心音频事件增多的问题,请为每个声源分配一个固定的 ID,使用 idX 参数,例如 idCITY、idWATERFALL 等。在创建新缓冲区之前,插件会清除任何带有相同 ID 的现有缓冲区,因此使用固定 ID 可以确保无论命令执行多少次,该声音始终只占用一个缓冲区。如果不指定 ID,则会回退到 *,这会在每次调用时生成一个新的唯一 ID,导致无法匹配并不断堆积。此外,建议为每种声音保持 ID 的唯一性,因为如果在已被占用的 ID 上启动第二种声音,会导致第一种声音停止。