首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WP7中歌曲播放开始性能不佳

WP7中歌曲播放开始性能不佳
EN

Stack Overflow用户
提问于 2012-04-03 18:33:43
回答 1查看 304关注 0票数 3

我有一个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()函数。

下面是我的代码片段:

代码语言:javascript
复制
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();
}

和操控者:

代码语言:javascript
复制
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]);
        }
    }
}

有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-06 13:46:58

毕竟,我找到了一个我满意的解决方案。它几乎完全消除了抖动。它的思想是在从线程池中获得的单独线程中使用每个MediaPlayer应用程序接口。我不知道它是如何解决这个问题的,但这对我来说真的很有效:

代码语言:javascript
复制
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();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9991487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档