[英]Poor performance on song playback start in WP7
我有一個運行在Silverlight環境下的XNA街機游戲。 該游戲有幾個聲音片段,以隨機順序播放作為背景音樂。
如http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.media.songcollection.aspx中所述 ,開發人員無法完全控制Media Player。 特別是,開發人員無法創建他們的歌曲集合或將歌曲添加到播放隊列。 建議通過調用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]);
}
}
}
有什么建議嗎?
畢竟,我找到了一個我滿意的解決方案。 它幾乎完全消除了搖晃。 它的想法是在從線程池獲得的單獨線程中使用每個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();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.