Windows phone 7 在C#WP7中查找SoundEffectInstance的基本SoundEffect
当播放太多声音时,WP7会受到相当严重的性能损失。我有一个AudioManager,它跟踪SoundEffect实例并防止太多实例同时播放 但是,有些东西不需要实例,只需对SoundEffect本身调用Play()。例如,子弹击中某物时发出撞击声,但实际上不需要实例 我当前的系统只管理实例。我想做的是看看我手头上是否有一个未使用的声音效果实例,然后简单地播放它。这需要找到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类型,检查是否播放了它,如果没有播放,则播放它。这样做将使我能够
希望这是有意义的,有人能给我指出正确的方向。要决定的重要事情是如何立即管理播放
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
的内部功能,所以您可以借用它的池代码,这与真正的XNASoundEffect
类似,然后使用它作为您自己的实例池和添加的功能的起点
还有其他方法可以做到这一点,这取决于您的体系结构。但是基本上,由您来跟踪音效和实例之间的关联。在XNAAPI中没有办法做到这一点(除了做一些讨厌的反射)