基本上我有一個聲音效果,當兩個項目在我的遊戲中相撞時播放。有些項目彼此非常接近,所以聲音效果可能必須快速連續播放。允許XNA SoundEffectInstance自己播放
使用SoundEffect.Play()可以使用。但是爲了保存垃圾收集,我想使用一個實例。不幸的是,這意味着一個實例不會播放,直到最後一個播放完畢。這不是我所追求的效果。有什麼方法可以重寫這個功能,否則我必須返回普通的舊SoundEffect?
基本上我有一個聲音效果,當兩個項目在我的遊戲中相撞時播放。有些項目彼此非常接近,所以聲音效果可能必須快速連續播放。允許XNA SoundEffectInstance自己播放
使用SoundEffect.Play()可以使用。但是爲了保存垃圾收集,我想使用一個實例。不幸的是,這意味着一個實例不會播放,直到最後一個播放完畢。這不是我所追求的效果。有什麼方法可以重寫這個功能,否則我必須返回普通的舊SoundEffect?
你有什麼理由要「節省垃圾收集?」除非你開始遇到實際的性能問題,否則很可能不需要擔心它。根據個人經驗,您可以快速連續播放至少一打聲音(使用SoundEffect.Play()
),不會有任何問題。然而,如果你覺得你的遊戲有很多碰撞,你可以做兩件事:
首先,考慮創建一個簡單的SoundPlayer
類來處理所有你玩的聲音,並且每當你發現超過10個同時玩的時候,防止下一個被玩。如果發生很多碰撞,玩家不會注意到缺少聲音。
其次,請看這裏(http://forums.create.msdn.com/forums/t/91165.aspx)關於如何使用DynamicSoundEffectInstance
來預混聲音。這有點複雜一些,但通過展望未來,將所有即將播放的聲音混合到單個緩衝區中,幾乎可以保證零延遲,因爲只有一個聲音(或一個音頻流緩衝區)有效播放。
啊,如果沒有簡單的方法來做它可能它精細。在我的遊戲中,它不可能同時發生10次或更多次的碰撞,所以我會留下它與正常SoundEffect.Play()的關係。感謝您的想法。 – DanTonyBrown 2012-03-11 16:34:46
List<SoundEffectInstance> explosionSoundInstanceList;
explosionSound = Content.Load<SoundEffect>("sound/explosion");
explosionSoundInstanceList = new List<SoundEffectInstance>(MAX_EXPLOSIONS);
for (int i = 0; i < MAX_EXPLOSIONS; i++)
{
explosionSoundInstanceList.Add(explosionSound.CreateInstance());
}
private void PlayExplosionSound(float volume, float pitch, float pan)
{
ClampSoundValues(ref volume, ref pitch, ref pan);
for (int i = 0; i < explosionSoundInstanceList.Count; i++)
{
if (explosionSoundInstanceList[i].State == SoundState.Stopped)
{
explosionSoundInstanceList[i].Volume = volume/(i+1);
explosionSoundInstanceList[i].Pitch = pitch;
explosionSoundInstanceList[i].Pan = pan;
explosionSoundInstanceList[i].Play();
return;
}
}
return;
}
工作正常。 實例化後的360上的零垃圾。 你達到極限後會失敗。
這就是我使用的。
我鉗位值正是如此
private static void ClampSoundValues(ref float volume, ref float pitch, ref float pan)
{
volume = MathHelper.Clamp(volume, -1f, 1f);
pitch = MathHelper.Clamp(pitch, -1f, 1f);
pan = MathHelper.Clamp(pan, -1f, 1f);
}
由於設置一個愚蠢的價值將下降一個例外。
可能重複[從一個實例重複聲音](http://stackoverflow.com/questions/8994292/repeating-sound-from-one-instance) – 2014-05-08 01:59:45