1

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

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

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

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

4

1 回答 1

0

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

但是,如果这是不可接受的,您将需要以某种方式强制执行硬限制。问题是:你打算怎么做?每个声音效果都会有该效果的最大实例数吗?或者你会有“声音课程”(课程有最大的播放次数)?还是只是全局最大声音数?是否会通过阻止播放额外的声音来强制执行上限?或者通过切断已经播放的声音?

我建议的是围绕它创建一个包装器对象,SoundEffect它实现了几乎相同的事情SoundEffect.Play(它在内部管理一个SoundEffectInstances 池,在它们完成播放时重用它们)。然后在其上添加您的播放上限功能。

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

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.

看看ExEn。因为它实现了 的内部结构SoundEffect,所以您可以借用它的池代码,这类似于真正的 XNASoundEffect所做的,然后将其用作您自己的实例池的起点,并添加您的功能。

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

于 2011-06-27T09:49:01.160 回答