在WP7上,歌曲播放启动表现差

3
我有一个在Silverlight环境下运行的XNA街机游戏。游戏中有一些声音剪辑以随机顺序播放作为背景音乐。
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]);
        }
    }
}

有什么建议吗?

在一些WP7设备上,我在我的游戏中观察到了相同的问题。 - Mix
1个回答

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();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接