首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >允许XNA SoundEffectInstance自我播放

允许XNA SoundEffectInstance自我播放
EN

Stack Overflow用户
提问于 2012-03-12 00:18:52
回答 2查看 1K关注 0票数 0

本质上,我有一个声音效果,当两个物品在我的游戏中碰撞时播放。其中一些项目彼此非常接近,因此音效可能必须快速连续播放。

使用SoundEffect.Play()可以做到这一点。然而,为了节省垃圾收集,我想使用一个实例。不幸的是,这意味着一个实例直到最后一个实例播放完毕后才会播放。这不是我想要的效果。有没有办法重写这个功能,或者我必须回到普通的旧SoundEffect?

EN

回答 2

Stack Overflow用户

发布于 2012-03-12 00:29:20

你有什么理由要“节省垃圾回收”吗?除非您开始遇到实际的性能问题,否则很可能不需要担心它。根据个人经验,您可以快速连续播放至少12个声音(使用SoundEffect.Play()),没有任何问题。然而,如果你觉得你的游戏有很多冲突,你可以做两件事:

首先,考虑创建一个简单的SoundPlayer类来处理您播放的所有声音,并且每当您检测到同时播放的声音超过10个时,就阻止播放下一个声音。如果有很多碰撞发生,玩家不会注意到丢失的声音。

其次,看看这里(http://forums.create.msdn.com/forums/t/91165.aspx)关于如何使用DynamicSoundEffectInstance来预混声音。这是相当复杂的,但通过向前看并将所有将要播放的声音混合到一个缓冲区中,您将几乎保证零延迟,因为只有一个声音(或一个音频流缓冲区)有效地播放。

票数 1
EN

Stack Overflow用户

发布于 2014-08-15 04:48:21

代码语言:javascript
复制
List<SoundEffectInstance> explosionSoundInstanceList; 


        explosionSound = Content.Load<SoundEffect>("sound/explosion");

        explosionSoundInstanceList = new List<SoundEffectInstance>(MAX_EXPLOSIONS);

        for (int i = 0; i < MAX_EXPLOSIONS; i++)
        {
            explosionSoundInstanceList.Add(explosionSound.CreateInstance());
        }



 private void PlayExplosionSound(float volume, float pitch, float pan)
    {

        ClampSoundValues(ref volume, ref pitch, ref pan);

        for (int i = 0; i < explosionSoundInstanceList.Count; i++)
        {
            if (explosionSoundInstanceList[i].State == SoundState.Stopped)
            {
                explosionSoundInstanceList[i].Volume = volume / (i+1);
                explosionSoundInstanceList[i].Pitch = pitch;
                explosionSoundInstanceList[i].Pan = pan;
                explosionSoundInstanceList[i].Play();
                return;
            }

        }

        return;
    }

工作正常。实例化后360上的垃圾为零。在你达到极限后就会优雅地失败。

我就是这么用的。

我就这样把值夹住了

代码语言:javascript
复制
    private static void ClampSoundValues(ref float volume, ref float pitch, ref float pan)
    {
        volume = MathHelper.Clamp(volume, -1f, 1f);
        pitch = MathHelper.Clamp(pitch, -1f, 1f);
        pan = MathHelper.Clamp(pan, -1f, 1f);
    }

因为设置一个愚蠢的值会丢弃异常。

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

https://stackoverflow.com/questions/9656649

复制
相关文章

相似问题

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