我的应用程序中有大约60个声音样本。我必须及时准确地发挥它。 5ms将完成。必须播放声音以响应用户操作。所以我不知道接下来会播放什么声音。我想大声地为所有声音预先创建了SoundEffectInstance。创建SoundEffectInstance会占用任何时间和内存吗?它是SoundEffect在内存中的完整副本还是只是一些指针信息。如果我要预先创建SoundEffectInstances,我可以改进我的应用程序吗?有没有其他方法可以在XNA中尽快播放样本?
答案 0 :(得分:3)
A SoundEffect
包含实际波形数据。它占用了大量内存(与波形数据一样多)。
SoundEffectInstance
是一个小对象,包含有关播放(位置,音量等)的数据以及已分配用于播放的“语音”句柄。
当您使用SoundEffect.Play
时,会在内部创建SoundEffectInstance
。它还可以汇集这些实例 - 因此不需要在后续调用中重新创建它们。
创建SoundEffectInstance
需要一些时间和内存。对于以30FPS(每帧33ms)运行的游戏中的声音效果,所涉及的延迟应该是难以察觉的。
如果您尝试通过混合不同的音效来播放有序音乐,即使5ms也很重要,您需要使用DynamicSoundEffectInstance
实现自己的音频混音器。这将确保声音同步到样本。
如果您正在尝试创建某种实时可播放的“乐器”,并且您尝试将输入到输出延迟降低到5毫秒 - 那么现在就放弃。 5ms是非常好的,通常需要专业的设备和软件。
尽管如此,如果您需要尽可能减少输入到输出延迟,您可以更频繁地轮询输入,而不是每帧一次。你应该仍然可以使用DSEI。我不确定DSEI是否具有可配置的播放缓冲区大小,但如果确实如此,则应该尽可能小,而不会引入音频故障。
答案 1 :(得分:2)
当用户选择一个集合时,您应该将这些声音效果加载到字典中,以便稍后访问它们会更快。
但是,您不应该加载所有声音效果,尤其是那些您在某个屏幕或设置中不需要的声音效果。另外,你应该卸下你不再需要的声音效果。
加载这些音效需要一些时间,具体取决于您要加载的大小和数量。我建议您制作一个基本的加载屏幕,用于加载/卸载游戏中的内容(大多数游戏都是这样做的)。您将在内存中加载soundeffect(wav格式?),而不仅仅是指针,这就是声音效果需要保持简短的原因。
已加载的声音效果将非常快(延迟不易察觉)。预加载将增加应用程序的性能,但会以内存使用为代价。