2012-04-03 47 views
3

我有一個運行在Silverlight環境中的XNA街機遊戲。遊戲中有幾個聲音片段隨機播放,作爲背景音樂。在WP7歌曲播放開始時表現不佳

http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.media.songcollection.aspx所述,開發人員無法完全控制媒體播放器。特別是,開發人員無法創建歌曲集合或將歌曲添加到播放隊列中。有建議通過調用MediaPlayer.Play()來一次播放一首歌曲。

這正是我正在做的,但每當另一首歌曲開始播放時,我都會遇到性能缺陷。儘管在遊戲初始化過程中加載了所有聲音剪輯,但不是在運行時加載,但我在調用MediaPlayer.Play()時暫停了遊戲。這隻發生在某些設備上(例如HTC Mozart)。相反,如果我在運行遊戲時禁用遊戲聲音並在手機的音樂播放器中播放相同的剪輯,則歌曲更改期間不存在任何性能問題。如果使用SoundEffect類播放剪輯,我也不會遇到性能問題。但是,由於以下兩個原因,我非常願意將MediaPlayer用於背景聲音目的: - SoundEffect在播放完成時不會發出通知 - SoundEffect似乎不適用於.mp3文件,並且使用.wav文件是非常昂貴的

我也運行分析測試,確認性能不佳的時間幀在MediaPlayer.Play()後的幾毫秒內開始並在大約0.4秒內持續。在此期間,我的遊戲不會執行任何重量級操作,只是常規遊戲計時器的Update()函數。

這裏是我的代碼片段:

public void PlayBackgroundMusic(Song song) 
{ 
    if ((!(App.Current as App).AppModel.SoundDisabled) && (song != null)) 
    { 
     if (MediaPlayer.State != MediaState.Stopped) 
     { 
      StopBackgroundMusic(); 
     } 
     MediaPlayer.Play(song); 
    } 
} 

public void StopBackgroundMusic() 
{ 
    MediaPlayer.Stop(); 
} 

和處理程序:

private void OnMediaStateChanged(object sender, EventArgs e) 
{ 
    if (MediaPlayer.State != MediaState.Playing) 
    { 
     if (!AppModel.SoundDisabled) 
     { 
      int index = soundRandomizer.Next(0, sounds.Length - 1); 
      PlayBackgroundMusic(sounds[index]); 
     } 
    } 
} 

是否有什麼建議嗎?

+0

觀察到同樣的問題,在我的遊戲上的一些WP7設備 – Mix 2012-04-03 10:54:10

回答

1

畢竟,我找到了一個我很滿意的解決方案。它幾乎完全消除了搖擺。它的想法是在從線程池獲得的單獨線程中使用每個MediaPlayer API。我不知道如何解決了這個問題,但是這真的對我的作品:

public void PlayBackgroundMusic(Song song) 
{ 
    if ((!(App.Current as App).AppModel.SoundDisabled) && (song != null)) 
    { 
     if (MediaPlayer.State != MediaState.Stopped) 
     { 
      StopBackgroundMusic(); 
     } 

     ThreadPool.QueueUserWorkItem((o) => 
     { 
      MediaPlayer.Play(song); 
     } 
    } 
} 

public void StopBackgroundMusic() 
{ 
    ThreadPool.QueueUserWorkItem((o) => 
    { 
     MediaPlayer.Stop(); 
    } 
}