トップページ > 過去ログ > 記事閲覧
画像読み込みと解放について
名前:THO 日時: 2012/01/29 23:53

今までバージョンVer 3.05fをDXライブラリを使用していたのですが、更新されていたようなので、Ver 3.07を導入しました。 現在、ゲーム製作をしているのですが、大きな画像を多く使う物となっており、メモリの使用量と戦いながら製作を進めていました。 ここでお聞きしたいのが、画像を読み込んだ時に使用されるメモリの量と、解放時に空くメモリの量です。 古いバージョンでの製作時には使用する画像を読み込んだ状態でのメモリ使用量が約200Mで、解放することによって、 その画像の分のメモリが使用量から減っていることが確認できました。 しかし、プログラムを新しいバージョンのライブラリで動かしてみると、メモリの使用量が約75Mになったのです。 メモリの使用量が小さくなるのは大変うれしいことなのですが、なぜ使用量がこんなに減ったのかがよくわからないのです。 更新履歴もよく読んだのですが、答えが見つからず・・・。 いろいろ自分でも調べてみて、おそらくこうなんじゃないかと思ったことが、読み込む画像の種類が A 2048*2048 B 1024*1024 C 512*512 D 256*256 の4種類の画像で、読み込み時にたとえばAのサイズの画像を読み込むと、約16Mメモリの消費量が増え、 次に別のAのサイズの画像を読み込むとメモリの消費量が変わらないのです。 で、Bの画像を読み込むと約4Mメモリ使用量が増え、同じように別のBのサイズの画像を読み込んでもメモリ消費量が増えないのです。 結果、メモリ消費量が増えたのは各サイズの画像を一番初めに読み込んだ時のみでした。 古いバージョンでのプログラムでは、各画像を読み込むごとにメモリ消費量が増え、合計で200Mほどになっていたので、 新しいバージョンではDxライブラリの画像の読み込み関係が素敵なことになっており、このようにメモリの消費量を抑えてくれたんだろうと思いました。 ですが、またここで気になることが発生しました。 画像の解放なのですが、新しいバージョンのほうでは、画像を解放してもメモリの使用量が減らないのです。 上記の例で言うと、Aのサイズの画像を読み込み、読み込んだ時点でのプログラムのメモリ使用量は約67Mで、 その画像を解放してもプログラムのメモリの使用量は変わらず約67Mのままなのです。 長々と書かせていただきましたが、教えていただきたいことの要点は二つで、 ・画像読み込み時のメモリの使用量について ・画像を解放してもメモリの使用量が減らない事について です。 よろしくお願いします。

Page: 1 |

Re: 画像読み込みと解放について ( No.1 )
名前:管理人 日時:2012/02/06 02:57

使用されているOSは WindowsVista か Windows7 でしょうか? DXライブラリは WindowsXP 以前と、WindowsVista 以降で使用している Direct3D の機能の一部が異なっていて、 WindowsXP 以前ではわりとメモリの許す限り画像を読み込める機能を使用して、 WindowsVista 以降はその機能が使用できないので VRAM の容量分だけ画像を読み込めるようになっています そして更に WindowsVista 以降のOSでの動作について Ver3.07 より前とそれ以降で一部動作に変更があります Vista 以降では VRAM に直接画像を配置しているのですが、VRAM に直接画像を配置している場合 XP 以前で使用している機能では可能だった「画像に直接アクセスする」ことができないので、XP 以前の処理と互換性を 持たせるために一つの画像に付き「直接アクセスできる同サイズのシステムメモリ上の画像」を用意して対処していました それを Ver3.07 からは「画像に直接アクセスしたいときに、アクセスしたい画像と同じ大きさのシステムメモリ上の 画像を用意して使いまわす」と、今まで一つの画像に付き一つ用意していたシステムメモリ上の画像を サイズの同じ画像同士では使いまわすことでメモリの無駄な消費を抑えるようにしました そして、この「使いまわすシステムメモリ上の画像」は一回作ったらずっと残して置くようにしています というのも、この「システムメモリ上の画像」を作る時間が長く( 画像が大きいと2ミリ秒以上も掛かったりします ) Ver3.07 に搭載した「非同期読み込み」の機能には都合が悪かったので、なるべく作る回数を減らしたかったからです ( あと単純に読み込み時間の短縮のためにも ) というわけで、Ver3.07 でVista以降の環境では THOさんのプログラムでは67MB分の「VRAM上の画像にアクセスするための 使いまわしようのシステムメモリ上の画像」が残っている状態なのだと思います そしてタスクマネージャで確認できる使用メモリは「システムメモリの使用量」なので、「VRAM の使用量」は確認できません システムメモリの使用量は確かに減りましたが、VRAM の使用量は Ver3.07以降とそれ以前では変わりありません VRAM は凡そ「画像のドット数×4byte」の分だけ消費していて、VRAM 容量がそれ以下しかない環境では動作しませんので ご注意ください( XP以前の環境ではシステムメモリの使用量が増える代わりに VRAM の容量以上の画像を扱うことができる 機能を使っているのですが、この機能が Vista 以降の環境で使っている Direct3D では使えなくなってしまいました・・・ )
Re: 画像読み込みと解放について ( No.2 )
名前:THO(解決) 日時:2012/02/07 23:47

なるほど、よくわかりました。 メモリの使用量が減ったことから、メモリ使用量を減らす為に 画像のサイズを小さくしたり、数を減らしたりということをせず 大きなデータを沢山扱えるというわけではなさそうですね。 いろいろ工夫しながら画像データなどを作り、いかに少ない メモリ使用量でゲームを作るかを考えながら、製作を続けて 行こうと思います。 ありがとうございました。

Page: 1 |