据我在手册中阅读,当您必须播放声音时,您需要一个Sound
对象,并制作一个临时SoundChannel
对象来控制实际播放。我想知道是否有一种内存有效的方式来管理这些SoundChannel
对象。到目前为止,这些似乎是“即发即弃”类型的对象,使它们半持久化的唯一方法是调用Sound.play()
大量的播放。但是这种方法不适用于一次性声音,例如箭头或按钮点击。如果我打电话SoundChannel.stop()
,我也可以丢弃该对象,因为没有办法让它恢复播放。有没有什么解决方案可以不疯狂地生成SoundChannel
对象,并且能够同时处理一次性声音播放和无限时间声音(即背景音乐)?
问问题
529 次
1 回答
1
SoundChannel
确实意味着要被丢弃,这种堆使用伴随着使用像 ActionScript 这样的语言的领域。
你不应该担心声音中的 GC 使用 - 过早的优化是邪恶的!您能做的最好的事情就是重复使用您的Sound
对象,而不是每次播放都创建一个新对象。如果您在每帧播放合理数量的声音,例如在游戏中,则应该不会有太多的 GC 问题。SoundChannel
s 是轻量级的,并且引用了音频数据的单个副本,因此它们并不是什么大问题。可能会有更重的分配需要担心,例如游戏对象或位图。
您可以通过使用SampleDataEventSoundChannel
动态混合音频来避免使用,但这肯定会产生相反的效果,并且处理器密集度更高,更不用说更难编码了。
如果你真的担心 GC,你可以使用System.pauseForGCIfCollectionImminent方法来提示 GC 在非侵入性时间运行,例如在游戏过渡期间。
于 2013-03-15T21:42:59.777 回答