私の単純な物理エンジンにデータ指向設計 (この記事などに基づく) を適用したいと考えています。また、最もコストがかかる部分である衝突テストの最適化に注力しています。
プレイヤーと衝突する可能性のある境界球を 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>
、同じ方法で作成するのは良い習慣ではないと思います。vector
points
一方、常に 2、3、4、または 10 ポイントがあるとは限りません (最大で約 20 で大きく異なりますが、通常ははるかに少ないです)。
そして、一般的な構造からたとえば一連の三角形に切り替えたくありません(多くの計算で分離された三角形よりも高速であるため)。Polygon
じゃあどうすればいいの?データ指向設計の精神に沿って、メモリ/キャッシュを効率的に使用したいと考えていPolygon
ます。
vector
内側の( )を取り除く必要がありpoints
ますか? もしそうならどうですか?