如果我每次创建它时都被迫重新启动每个粒子,我是否应该使用Pools作为粒子

时间:2013-01-17 20:32:41

标签: c# memory-management xna pool particle-system

我在XNA4中创建了一个粒子系统,但我遇到了问题。我的第一个粒子系统是一个简单的粒子列表,其实例是在需要时创建的。但后来我读到了关于使用池的信息。

我的第二个系统由一个充满粒子的池和一个发射器/控制器组成。 我的游泳池很基本,这是代码:

class Pool<T> where T: new ()
{
    public T[] pool;
    public int nextItem = 0;


    public Pool(int capacity)
    {
        pool = new T[capacity];

        for (int i = 0; i < capacity; i++)
        {
            pool[i] = new T();
        }
    }
    public T Create()
    {
       return pool[nextItem++];
    }
    public void Destroy(T particle)
    {
        pool[--nextItem] = particle;
    }
}

问题是池系统对CPU来说更加饥渴。每次我从池中取出粒子到我的发射器时我都被迫重新初始化并重置粒子,因为构造函数不存在而且这是一个问题。

使用池是否有任何意义,如果我重新初始化这些粒子,或者我应该为完全相同的对象的数组留下池,这些对象永远不会改变?

1 个答案:

答案 0 :(得分:5)

在XNA应用程序中,通常对象池不应该加速初始化。这是为了加快垃圾收集。控制台上的GC速度较慢,并且在整个更新功能运行16毫秒的游戏中,收集暂停可以明显地显着。这可能是或可能不是您特定情况的问题,特别是如果这是一个PC应用程序,取决于您使用的粒子的数量和生命周期。