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