XNA粒子系统问题

时间:2013-06-10 14:55:31

标签: c# xna particle-system particles

我一直在XNA中制作一个粒子系统,我正在尝试创建两个粒子效果。烟花爆炸和喷泉烟火。

我遇到的问题是,当我向爆炸中添加新粒子时(我正在快速执行此操作因为我希望它们同时产生所有这些),帧速率会大幅下降。

我想知道是否有人可以做出更好的解决方案。我看到官方示例使用队列方法。这有助于我面临的问题吗?或者是否会使程序加载速度变慢,因为它必须在开始时将所有这些粒子加载到队列中?

添加新粒子:

        if (isActive)
        {
            timeSinceLastEmission += gameTime.ElapsedGameTime.Milliseconds;

            if (emitterFrequency == 0 || timeSinceLastEmission >= emitterFrequency)
            {
                emitterFrequency = emissionInterval;

                for (int i = 0; i < Math.Round(timeSinceLastEmission / emitterFrequency); i++)
                {
                    if (particleList.Count < MaxParticles)
                        addParticle();
                }

                timeSinceLastEmission = 0;
            }
        }

绘制功能:

    public void draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Begin();

        for (int i = 0; i < particleList.Count; i++)
        {
            spriteBatch.Draw(particleList[i].texture,
                             particleList[i].position,
                             null,
                             particleList[i].color,
                             particleList[i].rotation,
                             particleList[i].origin,
                             particleList[i].textureScale,
                             SpriteEffects.None,
                             0);
        }

        spriteBatch.End();
    }

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

你需要做两件事:

首先,您需要将粒子类型设为struct而不是class(我猜它是。)

class分配堆内存,您的列表将充满对堆上这些对象的引用。每个堆对象都需要由垃圾收集器管理。当你有很多物体时,这很慢。 (同样请many reasons详细说明。)

然而,struct将直接位于为列表分配的内存中。运行时可以执行大量分配和清除内存的操作 - 速度更快。你的struct比引用大一点,所以尽量让它尽可能小。你真的需要每粒子纹理和原点吗?你可以制作那些每粒子系统。

(另一个很好的理由是因为SpriteBatch如果你避免纹理变化要快得多,因为它们需要一个新的批次 - 慢。)

其次,您应该将List.Capacity设置为粒子系统的最大大小。

或者,更好的是,您可以使用列表的构造函数来设置启动容量。这将一次分配列表所需的内存。每当列表达到容量时,它必须分配一个新的更大的列表,并复制其内容。因此,如果你开始它足够大,它就不必反复进行这种缓慢的操作。


(注意:你会发现你不能在列表中的结构上设置单独的成员,就像你可以使用类一样 - 编译器会给你一个错误。你必须复制整个结构,修改它,以及将其复制回来。这不是太糟糕。但是,如果你愿意,你可以通过使用数组来避免它 - 但是你必须自己管理大小和容量。)

(注意#2:这个答案中的“慢”与优化粒子系统有关,因为你正在处理大量频繁更新的对象。这些操作在一般意义上并不慢。)< / p>