actionscript-3 - Flash中内存有效的声音管理

标签 actionscript-3 audio memory-management

据我所阅读的手册,当您必须播放声音时,您需要一个Sound对象,并制作一个临时的SoundChannel对象来控制实际播放。我想知道是否有一种内存有效的方法来管理这些SoundChannel对象。到目前为止,这些对象似乎是“发射后遗忘”类型的对象,并且使它们成为半持久对象的唯一方法是通过大量的调用来调用Sound.play()。但是,这种方法不适用于一次性声音,例如箭击或单击按钮。如果我调用SoundChannel.stop(),我也可以丢弃该对象,因为没有任何方法可以使它恢复播放。有什么解决方案可以不产生疯狂的SoundChannel对象,并且能够处理一次声音播放和无限时间声音(又称为背景音乐)?

最佳答案

SoundChannel确实确实应该被丢弃,并且这种堆用法随使用诸如ActionScript之类的语言而来。

您不必担心声音中GC的使用-过早的优化是邪恶的!最好的办法就是重用Sound对象,而不是每次播放都创建一个新对象。如果您在游戏中每帧播放合理数量的声音,那么就不会有很多GC问题。 SoundChannel是轻量级的,可以引用音频数据的单个副本,因此它们没什么大不了的。可能会有很多麻烦的分配,例如游戏对象或位图。

您可以通过使用SampleDataEvent动态混合音频来避免使用SoundChannel,但这肯定会产生相反的效果,并且会占用更多的处理器,更不用说编写起来更困难了。

如果您真的担心GC,则可以使用System.pauseForGCIfCollectionImminent方法来提示GC在非侵入性时间内运行,例如在游戏过渡期间运行。

关于actionscript-3 - Flash中内存有效的声音管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15406202/

相关文章:

java - 加载 MIDI 文件时出现 EOF 异常

html - 更改 HTML5 音频节点的音高

c++ - 在 C++11 中,如何调用 new 并为对象预留足够的内存?

actionscript-3 - 如何从AS3中的麦克风字节数组播放声音?

actionscript-3 - 无法找到定义 fl.video.FLVPlayback

ios - ios中的音频流持续时间

memory-management - 确定给定地址的页码和偏移量

Flash CS4 与 Flash CS5 Actionscript - 我应该升级吗?

javascript - Actionscript 3 内联 JavaScript

c++ - C++ 中的垃圾回收/析构函数