0

私の単純な物理エンジンにデータ指向設計 (この記事などに基づく) を適用したいと考えています。また、最もコストがかかる部分である衝突テストの最適化に注力しています。

プレイヤーと衝突する可能性のある境界球を 1 つの にまとめましたvector

struct Sphere{ //I don't split sphere into parts, 
    //as I usually access both position and radius in my calculations
    Point3D position;
    float radius;
};
std::vector<BoudingSphere> spheres;

そして、単一の関数/メソッド内でそれらとの衝突をテストします。その時点まで、すべてが私にははっきりと見えます。

問題は、次のようなより一般的な構造もいくつかあることです。

struct Polygon{ //it may e.g. represents the area or be used for more precise tests      
    std::vector<Point2D> points;
};

ネストされた( ) はメモリ内で多くの場所を占める (予約する)ためstd::vector<Polygon>、同じ方法で作成するのは良い習慣ではないと思います。vectorpoints

一方、常に 2、3、4、または 10 ポイントがあるとは限りません (最大で約 20 で大きく異なりますが、通常ははるかに少ないです)。

そして、一般的な構造からたとえば一連の三角形に切り替えたくありません(多くの計算で分離された三角形よりも高速であるため)。Polygon

じゃあどうすればいいの?データ指向設計の精神に沿って、メモリ/キャッシュを効率的に使用したいと考えていPolygonます。

vector内側の( )を取り除く必要がありpointsますか? もしそうならどうですか?

4

1 に答える 1

0

この質問に対する決定的な答えはありません。データがいつ初期化されるか、初期化段階の後に変更できるかなど、データにアクセスする方法についての知識が必要になるためです。ただし、データが比較的安定しており、すべてのポリゴンまたは 1 つの特定のオブジェクトに属するポリゴンを反復するだけで一貫した方法でポリゴンにアクセスしている場合、ポリゴンのポイントを別のベクトルに配置して、ポリゴンは、その配列の開始インデックスと終了インデックスを格納します。

このように、トラバーサル中にアクセスする必要があるものがいくつかあります。まず、ポリゴンに格納されているインデックス。第二に、ポイント自体。ポリゴンもベクトルに配置されている場合、これらのアクセスはどちらもキャッシュに適している可能性があります。同様のアプローチをポリゴン セットに適用できます。ポリゴンをベクターに格納し、ゲーム オブジェクトに (開始、終了) ペアを設定するだけです。

于 2015-10-11T17:47:54.820 に答える