ECS?インターフェイス設計に影響を与える可能性があるため、設計のデータ指向の側面に多くの考慮を置き、さまざまな担当者をベンチマークするのは時期尚早ではない可能性があることを実際に示唆します。後者は後半に変更すると非常にコストがかかりますゲーム。また、ECSは多くの作業を必要とし、事前に考えます。そのため、その一部を利用して、設計レベルのパフォーマンスの悲しみが将来の心臓部にあることを考えれば、それより下に行かないようにする価値があると思います。全体の異常なエンジン。この部分は私をにらみつけます:
unordered_map<string,[yada]>
小さな文字列の最適化でも、別の可変サイズのコンテナー(unordered_maps)内に可変サイズのコンテナー(文字列)があります。あなたのテーブルが非常にまばらである場合には、小さな文字列の最適化は、ハッシュテーブルの各未使用のインデックスはまだ(SS最適化のためのより多くのメモリを使用することを意味するものであろうから、実際には、小さな文字列の最適化は、実際には、このような場合に役立つなどの有害となる可能性がありsizeof(string)
ます非常に大きくする)ハッシュテーブルの合計メモリオーバーヘッドが、格納するものよりもコストがかかる可能性がある点まで(特に、位置コンポーネントのような単純なコンポーネントである場合)、巨大なストライドによってキャッシュミスが増えるハッシュテーブルのあるエントリから次のエントリに移動します。
文字列はコンポーネントIDのようなある種のキーであると想定しています。もしそうなら、これはすでに物事を劇的に安くします:
unordered_map<int,[yada]>
...たとえば、スクリプト作成者が使用できるユーザーフレンドリな名前を付けることができるという利点が必要な場合は、インターンされた文字列によって、ここで両方の長所を利用できます。
そうは言っても、文字列をかなり使用頻度の高いインデックスの範囲にマッピングできる場合は、次のようにできるでしょう。
vector<[yada]> // the index and key become one and the same
私がこの時期尚早とは思わない理由は、これもまた、インターフェースの設計に影響を与える可能性があるためです。DODの目的は、一回のIMOで想像できる最も効率的なデータ表現を考え出そうとすることではなく(通常、必要に応じて反復して達成する必要があります)、それを上手にインターフェイスを設計するのに十分なものと考えることです。設計変更をカスケードすることなくプロファイリングおよび最適化するための十分な余地を残したデータ。
単純な例として、これに対してすべてのコードを結合するビデオ処理ソフトウェア:
// Abstract pixel that could be concretely represented by
// RGB, BGR, RGBA, BGRA, 1-bit channels, 8-bit channels,
// 16-bit channels, 32-bit channels, grayscale, monochrome,
// etc. pixels.
class IPixel
{
public:
virtual ~IPixel() {}
...
};
単一のピクセルレベルでの抽象化のアイデアはvptr
、画像レベルでの抽象化と比較して(それ自体がピクセル全体よりも多くのメモリを消費することが多い)ため、非常に非効率的です。多くの場合、数百万のピクセルを表します)。そのため、このような悪夢のようなシナリオに直面する必要がなく、理想的にはそれ以上にならないように、事前にデータ表現を十分に検討してください。ただし、ここでは、このようなことを事前に検討する価値があると思います。 ECSを取り巻く複雑なエンジン。ECS自体が、設計レベルでの変更を必要とする方法のボトルネックであることがわかります。
ECSキャッシュミスに関しては、私の意見では、開発者はしばしばECSキャッシュフレンドリーにするために努力しすぎています。完全に連続した方法ですべてのコンポーネントにアクセスしようとする人びとが小額の強打を生み出し始め、多くの場合、データをあちこちにコピーしてシャッフルすることを意味します。たとえば、アクセスする前にコンポーネントインデックスを基数でソートするだけで十分です。少なくともメモリ領域をキャッシュラインにロードしない方法でアクセスし、それを排除するためにロードします。同じキャッシュラインの別の部分にアクセスするためだけに、同じループで繰り返します。そして、ECSは、全体にわたって驚くべき効率を提供する必要はありません。これは、物理システムやレンダリングシステムと同じくらい、入力システムのメリットを享受するようなものではないので、「良い」を目指すことをお勧めします 全体的な効率性と、本当に必要な場所での「優れた」性能。そうは言っても、unordered_map
そして、これstring
は避けるのに十分簡単です。