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

最佳答案

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

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

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

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

09-03 19:31