コンテンツにスキップ

Data Locality

頻繁にアクセスするデータを連続メモリに配置し、キャッシュ効率を高める性能重視パターンです。

  • 弾やパーティクルのような大量オブジェクトを毎フレーム更新するとき
  • CPU ボトルネックを減らしたいとき
  • Hot Data: 頻繁にアクセスする値
  • Contiguous Storage: 連続配列
  • Loop: 単純な反復処理

以下のコードは、上で説明した状況を Unity プロジェクトの文脈で単純化した例です。

using UnityEngine;
public struct ProjectileState
{
public Vector3 Position;
public Vector3 Velocity;
}
public static class ProjectileSimulation
{
public static void Simulate(ProjectileState[] projectileStates, float deltaTime)
{
for (int projectileIndex = 0; projectileIndex < projectileStates.Length; projectileIndex++)
{
projectileStates[projectileIndex].Position += projectileStates[projectileIndex].Velocity * deltaTime;
}
}
}
  • 連続メモリアクセスによってキャッシュミスを減らし、大量演算の性能を向上できます。
  • Burst や Jobs のようなデータ指向処理と組み合わせると特に効果的です。
  • 構造を性能優先に寄せすぎると、可読性やドメイン表現が弱くなることがあります。
  • 配列同期やインデックス管理を誤ると、データ不整合バグが起きやすくなります。

連続メモリブロックを順次処理してキャッシュ効率を高める流れです。

Data Locality の流れ