2012-03-06 25 views
5

我的應用程序中有大約60個聲音樣本。我必須及時地以高精確度播放它。 5毫秒會更好。聲音必須響應用戶的操作而播放。所以我不知道接下來會發生什麼。對於所有聲音,我都想到了SoundEffectInstance的預先創建。創建SoundEffectInstance是否需要時間和內存?它是在內存中的SoundEffect的完整副本還是隻是一些指針信息。如果我要預先創建SoundEffectInstances,我可以改進我的應用程序嗎? XNA中有沒有其他方法可以儘快播放樣本?如何儘快播放聲音?

+0

您是否需要應用程序中任何時候的所有聲音,或者是否爲不同的屏幕分配了聲音? – Msonic 2012-03-06 17:58:01

+0

很少設置60個聲音。用戶選擇設置,那麼它可能是任何設置的聲音 – xander27 2012-03-06 18:22:38

回答

3

A SoundEffect包含實際的波形數據。它消耗了大量的內存(與波形數據所需要的一樣多)。

A SoundEffectInstance是一個小對象,包含有關播放(位置,音量等)的數據以及已分配用於播放的「語音」句柄。

當您使用SoundEffect.Play時,它會在內部創建一個SoundEffectInstance。它也可以彙集這些實例 - 因此它不需要在隨後的調用中重新創建它們。

創建SoundEffectInstance需要一些時間和內存。對於以30FPS(每幀33毫秒)運行的遊戲中的聲音效果,所涉及的延遲應該不可察覺。


如果你想通過混合不同的聲音效果,甚至在那裏5ms的事情,你需要使用DynamicSoundEffectInstance實現自己的混音器播放音樂排序。這將確保聲音與樣本同步。


如果你想創建某種實時播放的「工具」,而你試圖讓你的輸入到輸出的延遲降低到5ms的 - 那麼現在放棄。 5毫秒是非常好的,通常需要專業設備和軟件。儘管如此,如果您需要儘可能減少輸入到輸出延遲,您可以更頻繁地輪詢輸入,而不是每幀一次。你應該仍然可以使用DSEI。我不確定DSEI是否具有可配置的回放緩衝區大小,但是如果是這樣,您應該儘可能小,而不會引入音頻干擾。

2

當用戶選擇一個集合時,您應該將這些聲音效果加載到字典中,以後訪問它們會更快。

但是,您不應該加載所有聲音效果,特別是那些在特定屏幕或設置中不需要的聲音效果。另外,您應該卸載您不再需要的音效。

根據要載入的大小和數量,加載這些聲音效果確實需要時間。我建議你製作一個基本的加載屏幕來加載/卸載遊戲中的內容(大多數遊戲都是這樣做的)。您將在內存中加載soundeffect(我猜是wav格式),而不僅僅是一個指針,所以這就是爲什麼音效需要保持短暫的原因。

已經加載的音效將播放得非常快(延遲是不可察覺的)。預加載將會增加應用程序的性能,代價是內存使用量。

+0

我需要爲每個聲音或SoundEffect預加載SoundEffectIstance對象嗎? – xander27 2012-03-07 03:13:18

+1

我發現那裏[鏈接](http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.audio.soundeffect.aspx)**「從SoundEffect創建的所有SoundEffectInstance對象共享內存資源「**。所以我可以創建任何數量的'SoundEffectInstance' – xander27 2012-03-07 04:56:01