4

XNA4でパーティクルシステムを作成していますが、問題が発生しました。私の最初のパーティクルシステムは、必要なときにインスタンスが作成されるパーティクルの単純なリストでした。しかし、それから私はプールの使用について読みました。

私の2番目のシステムは、粒子で満たされたプールと、エミッター/コントローラーで構成されています。私のプールはかなり基本的です、これはコードです:

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に対してはるかに飢えていることです。プールからエミッターにパーティクルを取り出すたびに、コンストラクターがないため、パーティクルを再初期化してリセットする必要があります。これは問題です。

プールを使用する意味はありますか?それらのパーティクルを再初期化する場合、または変更されない完全に同一のオブジェクトの配列用にプールを残す必要がある場合はどうなりますか?

4

1 に答える 1

5

XNA アプリケーションでは、通常、オブジェクト プーリングによって初期化が高速化されることは想定されていません。ガベージコレクションを高速化するためです。コンソールの GC は遅く、更新関数全体の実行に 16 ミリ秒かかるゲームでは、コレクションの一時停止が目に見えて目立つ場合があります。これは、特にこれが PC アプリケーションの場合、使用しているパーティクルの数と寿命に応じて、特定のケースで問題になる場合とそうでない場合があります。

于 2013-01-17T21:54:13.737 に答える