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