在C#WP7中查找音效实例的基本音效

时间:2011-06-27 06:22:35

标签: windows-phone-7 xna soundeffect soundeffectinstance

当播放太多声音时,WP7会遭受相当严重的性能损失。我有一个跟踪SoundEffectInstances的AudioManager,可以防止一次播放太多。

但是,有些东西不需要实例,只需在SoundEffect本身上调用Play()即可。例如,当子弹击中某些东西但实际上并不需要实例时,子弹会发出冲击声。

我当前的系统只管理实例。我想做的是看看我手头的SoundEffect的现有实例是否未被使用并且只是播放它。这需要找到SoundEffectInstance的SoundEffect类型,检查它是否已播放,如果没有则播放。这样做可以让我更准确地跟踪总播放声音。

希望这是有道理的,有人可以指出我正确的方向。

1 个答案:

答案 0 :(得分:0)

重要的是要决定如何一次管理游戏次数SoundEffectInstances?显而易见的方法是修改你的游戏代码(或等级或其他),使得播放声音的数量永远不会变得太大。

但如果这是不可接受的,你需要以某种方式强制实施硬限制。问题是:你打算怎么做?每个声音效果都会产生最大数量的效果吗?或者你会有“声音课程”(班级有最大游戏次数)?或者只是全球最大声音计数?是否会通过阻止播放其他声音来强制执行上限?或者通过切断已经播放的声音?

我建议在SoundEffect周围创建一个包装器对象,它实现与SoundEffect.Play完全相同的事情(它在内部管理SoundEffectInstance池,在它们重用时重用它们已完成比赛)。然后在其上添加播放上限功能。

所以你的包装类可能看起来像这样:

class MySoundEffect
{
    SoundEffect sound;
    List<SoundEffectInstance> instances;
    int maxInstances;
}

或者也许是这样:

class MySoundEffect
{
    static int[] soundClassMaximums = { 2, 2, 5, 10 };
    static int[] soundClassInstanceCount;

    SoundEffect sound;
    List<SoundEffectInstance> instances;
    int class;
}

然后你会在MySoundEffect使用SoundEffect的任何地方使用SoundEffect

看看ExEn。因为它实现了SoundEffect的内部,你可以借用它的池代码,它类似于真正的XNA {{1}}所做的,然后用它作为你自己的实例池的起点。增加了功能。

还有其他方法可以做到,这取决于您的架构。但基本上由你来跟踪声音效果和实例之间的关联。在XNA API中没有办法做到这一点(没有做一些讨厌的反思)。