1

私は最近、最初のゲーム エンジンを開発しているので、パフォーマンスがすべてです。私は C++ の専門家ではありませんが、いくつかの調査の結果、キャッシュとメモリ アラインメントの重要性を発見しました。

基本的に私が見つけたのは、ループなどで一緒にアクセスする必要がある場合は、メモリを特別に整列させることをお勧めすることです。

今、私のプロジェクトでは、ゲーム オブジェクト マネージャーを実行しており、GameObjects 参照の配列を持つことを考えていました。つまり、オブジェクトの実際の記憶が次々と得られます。

static const size_t MaxNumberGameObjects = 20;
GameObject mGameObjects[MaxNumberGameObjects];

しかし、ゲーム オブジェクトがコンポーネント (メッシュ、リジッドボディ、トランスフォーメーションなど) のリストを持つコンポーネント ベースのデザインを実装する場合、配列を使用して何か得られるのでしょうか?

とにかく、単純な std::map をゲーム オブジェクトの格納に使用している人を見たことがあります。それで、あなたたちはどう思いますか?

純粋なコンポーネント モデルを使用した方がよいでしょうか?

4

2 に答える 2

3

インターネット上にはキャッシュの使用に関するリソースがたくさんありますが、キャッシュとメモリ システムについて十分に理解するために、「すべてのプログラマがメモリについて知っておくべきこと」を学習することをお勧めします。

ただし、簡単なポイントとして、オブジェクトをキャッシュ ラインにうまく収め、「ホット」データと「コールド」データを分離します。

于 2010-05-22T19:42:38.100 に答える
1

メモリ アクセスとキャッシュの使用に慣れていない場合は、Nikolai の「すべてのプログラマがメモリについて知っておくべきこと」へのリンクを参照してください。

当面の質問については:

各コンポーネント タイプを、連続した配列に格納される独自のプールに格納することをお勧めします。元:

ComponentPool<CollisionComponent> mCollisionComponents;
ComponentPool<MeshComponent> mMeshComponents;
...

を割り当てるGameObject(プールからプルする) ときは、オブジェクトが必要とする特定のコンポーネントを割り当てます。

ここで、コンポーネントでこれを行うことは避ける必要があります。

void SomeCollisionWork() {
    for each object {
        if(object.hasCollisionComponent()) {
            DoCollisionWork(object.collisionComponent)
        }
    }
}

代わりに、次のようにアプローチできます。

void SomeCollisionWork() {
    for each allocated component in mCollisionComponents {
        DoCollisionWork(component)
    }
}

元の (またはそのオブジェクトの他のコンポーネント) が本当に必要な場合はGameObject、各コンポーネントにいくつかのデータ (ゲームオブジェクトのインデックスなど) を保存できます。オブジェクトのインデックスを使用すると、他の の他ComponentPoolのコンポーネントにアクセスできます。

このすべてのポイントは何ですか?機能を特定のチャンク、つまり「ジョブ」に分割するのは非常に簡単になります。次に、相互に依存していないコンポーネントがある場合は、それらを並行して処理できます (「将来の」パフォーマンスにとって重要です)。

詳細については、Insomniac Games が開発した動的コンポーネント システムに関する次のプレゼンテーションをご覧になることをお勧めします (スピーカー ノートを必ずお読みください): https://docs.google.com/present/edit?id=0ATIohmzo6z7TZGhjbmhidnFfMTg1MWNkcTJmcWZ4&hl =en

于 2010-06-04T00:29:25.507 に答える