Windows phone 7 在C#WP7中查找SoundEffectInstance的基本SoundEffect

Windows phone 7 在C#WP7中查找SoundEffectInstance的基本SoundEffect,windows-phone-7,xna,soundeffect,soundeffectinstance,Windows Phone 7,Xna,Soundeffect,Soundeffectinstance,当播放太多声音时,WP7会受到相当严重的性能损失。我有一个AudioManager,它跟踪SoundEffect实例并防止太多实例同时播放 但是,有些东西不需要实例,只需对SoundEffect本身调用Play()。例如,子弹击中某物时发出撞击声,但实际上不需要实例 我当前的系统只管理实例。我想做的是看看我手头上是否有一个未使用的声音效果实例,然后简单地播放它。这需要找到SoundEffectInstance的SoundEffect类型,检查是否播放了它,如果没有播放,则播放它。这样做将使我能够

当播放太多声音时,WP7会受到相当严重的性能损失。我有一个AudioManager,它跟踪SoundEffect实例并防止太多实例同时播放

但是,有些东西不需要实例,只需对SoundEffect本身调用Play()。例如,子弹击中某物时发出撞击声,但实际上不需要实例

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


希望这是有意义的,有人能给我指出正确的方向。

要决定的重要事情是如何立即管理播放
SoundEffectInstances
的数量?最明显的方法是修改游戏代码(或级别或其他),这样游戏声音的数量就不会增长太多

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

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

因此,您的包装器类可能如下所示:

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
{
音响效果;
列举实例;
int最大实例;
}
或者像这样:

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
{
静态int[]SoundClassMaximum={2,2,5,10};
静态int[]soundClassInstanceCount;
音响效果;
列举实例;
int类;
}
然后,您可以在通常使用
SoundEffect
的任何地方使用
MySoundEffect

看一看。因为它实现了
SoundEffect
的内部功能,所以您可以借用它的池代码,这与真正的XNA
SoundEffect
类似,然后使用它作为您自己的实例池和添加的功能的起点

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