C# XNA粒子系统问题

C# XNA粒子系统问题,c#,xna,particle-system,particles,C#,Xna,Particle System,Particles,我在XNA中制作了一个粒子系统,我正在尝试创建两个粒子效果。爆竹爆炸和喷泉爆竹 我遇到的问题是,当我向爆炸中添加新粒子时(我这么快做是因为我想让它们同时繁殖),帧速率会大大降低 我想知道是否有人能想出一个更好的解决办法。我看到官方示例使用了队列方法。这有助于解决我面临的问题吗?或者它会使程序加载变慢,因为它必须在开始时将所有这些粒子加载到队列中 添加新粒子: if (isActive) { timeSinceLastEmission +=

我在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;
            }
        }
if(isActive)
{
TimesInclastEmission+=gameTime.ElapsedGameTime.毫秒;
如果(发射器频率==0 | | TimesInclastEmission>=发射器频率)
{
发射频率=发射间隔;
对于(int i=0;i
绘图功能:

    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();
    }
public void draw(SpriteBatch-SpriteBatch)
{
spriteBatch.Begin();
for(int i=0;i

任何帮助都将不胜感激。

您需要做两件事:

首先,您需要将粒子类型设置为
struct
而不是
(我猜是这样的。)

一个
分配堆内存,您的列表将充满对堆上那些对象的引用。这些堆对象中的每一个都需要由垃圾收集器管理。当你有很多物体时,这是非常缓慢的。(我也不想在此详述。)

然而,
struct
将直接位于为列表分配的内存中。运行时可以批量分配和清除内存,速度要快得多。您的
struct
比引用要大一点,所以请尽量使其小一些。您真的需要每粒子纹理和原点吗?你可以用每粒子系统来做

(另一个很好的原因是,如果避免纹理更改,则SpriteBatch的速度要快得多,因为它们需要新的批处理-慢。)

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

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


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


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

你的emitterFrequency和MaxParticles是什么?每个效果都不同,但爆炸效果是30个粒子和1.0f的频率,所以它们都会同时繁殖。谢谢,我会试试这个。我在一分钟内对所有粒子使用相同的纹理,直到它正常工作。