B級科学者もどきの憂鬱

とある理系になりきれない奴のつれづれなる活動記

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

適切なメモリ管理方法は?

私は今まで、PCゲームは一度も作ったことがなかったのですが、
何故か、諸事情でDirectXでゲームを作る羽目になりました。
その関係でちょっとまた忙しくなっています。
と言っても、前ほどではありませんが。

今回はそれに関連した、メモリ管理方法の話です。
正直私も大したことは知らないので、
もっといい方法を知っている方は教えて下さると泣いて喜びます。

ゲームに限らず、大量の画像や音楽ファイルを扱うソフトは、
メモリ管理がかなり重要になりますよね。
特に、低スペックパソコンでも動くようにしたい場合は重要です。

無駄を省くため、必要のあるものだけを確保し、
いらなくなれば即座に解放したいところですが、
明示的にnew deleteを書くだけのプログラムは、
かなり危険なので出来る限り避けるべきだとは思います。

ある所でメモリが確保されたら、
明示的に解放しても大丈夫で、解放を忘れても
システムが自動で解放してくれるのが理想的です。
それをやってくれるのがガベージコレクタですが、
通常のC++にはそれはありません。

とりあえず私は次善の策として、
解放の必要なものは色々とクラス化して、
明示的に解放するのはもちろん、解放を忘れても、
デストラクタで勝手に解放してくれるようにしました。

毎度毎度クラスを作るのは多少面倒ですが、
クラスをnewで確保せずに通常の変数として宣言すれば、
寿命が来れば勝手にデストラクタが動くので、解放忘れはなくなります。

一応これである程度上手く実装できたと思うのですが、
本来こういう場合のメモリ管理って、
どんなふうに書くのがセオリーなんでしょうか?
何か代表的な手法とかあれば是非知りたいです。

一応今後の方向としては、メモリ不足が検出された場合、
自動的に解放されるような仕組みも作ろうと思っています。

そのために、メモリ管理クラスを実装していこうと思います。
このクラスはDirectXに限らず汎用的に使えるようにしておけば、
音声合成関係など、他の開発にも使えそうですね。
まぁこんなことやってるからプログラムが進まないんですが。

本当はガベージコレクションを実装して、
メモリ領域を効率的に使えるようにもしたいのですが、
テクスチャ用メモリの確保などはDirectXの関数が内部で行うため、
確保された領域のアドレスがわかりません。
なので、不可能ではないかも知れませんが、かなり困難なので断念します。
スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。