我有一个XNA街机游戏,运行在Silverlight环境中。这个游戏有几个声音片段,它们以随机的顺序播放作为背景音乐。
正如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]);
}
}
}有什么建议吗?
发布于 2012-04-06 13:46:58
毕竟,我找到了一个我满意的解决方案。它几乎完全消除了抖动。它的思想是在从线程池中获得的单独线程中使用每个MediaPlayer应用程序接口。我不知道它是如何解决这个问题的,但这对我来说真的很有效:
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();
}
}https://stackoverflow.com/questions/9991487
复制相似问题