1

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

4

1 回答 1

1

SoundChannel确实意味着要被丢弃,这种堆使用伴随着使用像 ActionScript 这样的语言的领域。

你不应该担心声音中的 GC 使用 - 过早的优化是邪恶的!您能做的最好的事情就是重复使用您的Sound对象,而不是每次播放都创建一个新对象。如果您在每帧播放合理数量的声音,例如在游戏中,则应该不会有太多的 GC 问题。SoundChannels 是轻量级的,并且引用了音频数据的单个副本,因此它们并不是什么大问题。可能会有更重的分配需要担心,例如游戏对象或位图。

可以通过使用SampleDataEventSoundChannel动态混合音频来避免使用,但这肯定会产生相反的效果,并且处理器密集度更高,更不用说更难编码了。

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

于 2013-03-15T21:42:59.777 回答