未使用メモリをファイルキャッシュに利用する

メモリマップってどうしてる?

リリースした製品は、可能な限りRAMを使い切りたい。
少しでもお客様が払った金額分ハードウェアを使いきりたい。

開発中は、開発に必要な機能のプログラムやデータ、万が一の備え(へそくり)のためのメモリが必要ですが、リリースすると空いたまま。

もったいない!

しかし、メモリはぎりぎりを攻めすぎるとハングアップ。
へそくりを残しつつ、製品では無駄がない方法… 15年前くらいから取り組み始めました。

おそらくメモリの使用方法は、ゲームプログラマの悩みの一つなのではないでしょうか?

未使用メモリの活用

いくつかの対策の一つが未使用領域をキャッシュに割り当てるヒープの制作。
WindowsなどのOSでは当たり前の技術ですが、メモリが限られたゲーム機ではメモリブロックの断片化が深刻になります。

断片化は確保するメモリブロックの配置先がバラバラになり、悪化すると総容量は空いているのにメモリが確保できなくなる状態です。メモリの断片化

ヒープが下の段の様になってしまうと、ハラハラしてきますよね。

断片化対策

最初に容量の大きい絵や音のデータを別ヒープに分ける事が考えられます。

また、断片化は確保するメモリブロックのサイズが平均化されることで、影響を限定的にする事ができます。

さらに、ヒープ内で確保する位置を上と下からから確保。ファーストマッチとベストマッチで分けるなど、メモリを利用するデータの特性で確保位置を変更する事をしました。

別の手として、垂直同期の空き時間に未参照のメモリ(キャッシュデータ)を隣接するように移動して、キャッシュ領域を連続化。
つまり将来の空きメモリ候補を連続化する対策をしています。この時、使用頻度に応じて並べるとより連続的な空きメモリへ戻すことができるでしょう。

効果はあったのか?

キャッシュの効果はヒット率次第で大きく変動しますが、シーンを往復するような捜索系のゲームで効果を発揮しました。
シーンジャンプの長さが推理を邪魔しない。そんなお手伝いができたと感じています。

技術的なつぶやき、技術ブログの始まり

技術ブログがいよいよ始まりました。まだまだ手探りで記事を書いています。
コラムよりも、ちょっと技術が絡んだ話ができたらと思います。

そうそう、グレッゾではマルチコアを使い切りたい!シェーダごりごり書きたい!
そんなエネルギーを持て余したあなたの応募をお待ちしています!