2012-04-03 48 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(); 
    } 
}