前回はUnityでclass(struct)のメンバアドレスを表示するツールのご紹介をしました。
Unityでメモリ位置を表示するツール
今回は実践編で、データを連続するメモリ配置にすることによって、実際のパフォーマンスにどのぐらい違いが出るのかを取り上げます。
Unityプロジェクト
コチラのプロジェクトのTestDataLocality.unityシーンを起動します。
実行するとGameEntityクラスをMax Entities分配置します。

(Unityの反応が戻ってこない場合にはMax Entitiesの値を調整して下さい)
前回紹介したツールでメモリ配置を確認してみると、

↑のm_contiguousでは構造体を使った連続したメモリ順になっているのに対して、

↑のm_scatteredではクラスによってあちこっち離れたメモリ配置になるように調整しています。
この2つの状態で実行パフォーマンスを計測してみます。
GameLoopクラスはGameEntityを順番に処理するプログラムになっています
画面上のボタンを押すと実行します

表示は処理にかかった時間になっています。
連続したメモリ配置の場合とその逆では、約5倍の差が出ました。
次に、IL2CPPでも計測してみます。
実際にバイナリを作って手持ちの環境で確認してみてください。

ネイティブの効果でパフォーマンスそのものは上がっていますが、CPUキャッシュの効率利用の差は依然と残ったままです。
メモリバス幅の広い M4 Pro でこの差ですから、古めのモバイルCPUではもっと違いが出てきそうです。
実際のゲームコードとは掛け離れた極端な検証ですが、同じ処理をする2つのプログラムでもパフォーマンスに大きな違いが出ることが分かりました。
群衆表現や、パーティクルなどの最適化の際の参考にしてもらえればと思います。






