首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C# WP7中查找SoundEffectInstance的基本SoundEffect

在C# WP7中查找SoundEffectInstance的基本SoundEffect
EN

Stack Overflow用户
提问于 2011-06-27 14:22:35
回答 1查看 469关注 0票数 1

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

但是,有些东西不需要实例,只需在SoundEffect本身调用Play()即可。例如,一颗子弹击中某物时会播放撞击声,但实际上并不需要实例。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-27 17:49:01

要决定的重要事情是你如何一次管理SoundEffectInstances的播放次数?最明显的方法是修改你的游戏代码(或关卡或其他东西),这样播放声音的数量就不会变得太大。

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

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

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

代码语言:javascript
复制
class MySoundEffect
{
    SoundEffect sound;
    List<SoundEffectInstance> instances;
    int maxInstances;
}

或者像这样:

代码语言:javascript
复制
class MySoundEffect
{
    static int[] soundClassMaximums = { 2, 2, 5, 10 };
    static int[] soundClassInstanceCount;

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

然后,您可以在通常使用SoundEffect的任何地方使用MySoundEffect

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6489276

复制
相关文章

相似问题

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