如何尽快播放声音?

5

我的应用程序中有大约60个声音样本。我必须在规定的时间内准确播放它,时间精度达到5毫秒。声音必须响应于用户的操作。因此,我不知道下一个声音会是什么。我正在考虑为所有声音预先创建SoundEffectInstance。创建SoundEffectInstance需要多少时间和内存?它是否是SoundEffect在内存中的完整副本或只是一些指针信息。如果我预先创建SoundEffectInstances,能否改善我的应用程序?在XNA中,是否有其他播放声音样本的方法可以尽快实现?


您在应用程序中是否需要所有声音,或者为不同的屏幕分配了声音? - Msonic
几个集合,每个集合有60个声音。用户选择一个集合,然后可以从该集合中选择任何声音。 - xander27
2个回答

3
一个SoundEffect包含实际的波形数据。它需要大量内存(与波形数据所需的相同)。 SoundEffectInstance是一个小对象,包含有关播放(位置、音量等)的数据和已分配用于播放的“声音”句柄。
当您使用SoundEffect.Play时,内部会创建一个SoundEffectInstance。它还可以池化这些实例,因此不需要在后续调用中重新创建它们。
创建SoundEffectInstance需要一些时间和内存。对于以30FPS(每帧33ms)运行的游戏中的声音效果,涉及的延迟应该是无法察觉的。
如果您试图通过混合不同的声音效果来播放序列音乐,即使5ms也很重要,则需要使用DynamicSoundEffectInstance实现自己的音频混合器。这将确保声音同步到样本。
如果您正在尝试创建某种实时可播放的“乐器”,并且您正在尝试将输入到输出的延迟降低到5ms,则现在就放弃吧。 5ms非常好,通常需要专业设备和软件。
不过,如果您需要尽可能地减少输入到输出的延迟,可以比每帧更频繁地轮询输入。并且您仍然可能需要使用DSEI。我不确定DSEI是否具有可配置的播放缓冲区大小,但如果有,您应该尽可能将其缩小,而不会引入音频故障。

2
当用户选择一个集合时,你应该将这些音效加载到字典中,这样以后访问它们会更快。
然而,你不应该加载所有的音效,特别是那些在某个屏幕或集合中不需要的音效。此外,你应该卸载你不再需要的音效。
加载这些音效需要时间,取决于你想要加载的大小和数量。我建议你为游戏制作一个基本的加载屏幕来加载/卸载内容(大多数游戏都是这么做的)。你将把音效(我猜是wav格式?)加载到内存中,而不仅仅是指针,所以音效需要保持简短。
已经加载好的音效会非常快地播放(延迟是无法察觉的)。预加载会增加应用程序的性能,但会增加内存使用量。

我需要为每个声音预加载SoundEffectIstance对象还是只需预加载SoundEffect对象? - xander27
1
我在这里找到了一个链接(http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.audio.soundeffect.aspx),其中提到:“所有从SoundEffect创建的SoundEffectInstance对象共享内存资源”。因此,我可以创建任意数量的`SoundEffectInstance`。 - xander27

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接