C++とSDL2を使ったメモリ管理学習用プロジェクトです。
コンシューマゲームの最適化エンジニアを目指すために簡易的な2Dゲームを用いて実装を行っています。
- スタックとヒープの違い
- メモリレイアウトとパディング
- オブジェクトプールによるメモリ管理
- フリーリストによる探索コストの削減
- アクティブリストによる不要ループの削減
- テンプレートを使った汎用プール設計
Pool<T, MAX>: 汎用オブジェクトプール- フリーリストによるO(1)のalloc
- アクティブリストによる不要スロットのスキップ
- 二重free検出
- カスタムスタックアロケータの実装
- カスタムヒープアロケータの実装
- Visual Studioプロファイラによる詳細計測
- データ指向設計(DOD)への移行
- Visual Studio 2022(C++によるデスクトップ開発)
- CMake 3.20以上
- SDL2(別途ダウンロードが必要)
- SDL2公式 から
SDL2-devel-x.x.x-VC.zipをダウンロード - 解凍して
libs/SDL2/に配置する
MyGame/
├── CMakeLists.txt
├── README.md
├── src/
│ └── main.cpp
└── libs/
└── SDL2/ ← ここに配置
├── include/
└── lib/
mkdir build
cd build
cmake ..
cmake --build .build/Debug/MyGame.exeが生成されます。
| 項目 | 内容 |
|---|---|
| 言語 | C++17 |
| グラフィック | SDL2 |
| ビルドシステム | CMake |
| IDE | Visual Studio 2022 |
| 方式 | 処理時間 | 倍率 |
|---|---|---|
| new/delete(ヒープ) | 10,272 us | 1x |
| プール | 286 us | 約35倍高速 |
プールアロケータにより約35倍の高速化を確認。
new/deleteによるメモリフラグメンテーションと
アロケーションコストを排除した結果です。
| アクセス方式 | 処理時間 |
|---|---|
| 連続アクセス(プール) | 163 us |
| ランダムアクセス(ヒープ) | 194 us |
データを連続メモリに配置することでCPUキャッシュ効率が向上します。
Pool enemyPool;
Pool attackPool;
Pool effectPool;型とサイズをテンプレート引数で指定するだけで
どんなオブジェクトにも使える汎用プールを実現しています。
ゲーム実行中に各プールのメモリ使用量をリアルタイムで表示します。
- 各プールの使用中バイト数 / 最大バイト数
- 使用率をカラーバーで可視化(緑→赤)
- 合計メモリ使用量の表示