Re: CreateGraphFromMemとLoadGraph ( No.1 ) |
- 名前:みけCAT 日時:2013/10/24 07:59
対照実験をしてみてはいかがですか?
今回の場合、圧縮暗号化をしていないデータをファイルからメモリに読み込み、それをCreateGraphFromMemするということです。
|
Re: CreateGraphFromMemとLoadGraph ( No.2 ) |
- 名前:管理人 日時:2013/10/26 16:49
ご指摘の通り LoadGraph などの関数でファイルから画像を読み込んだ場合より
CreateGraphFromMem などの関数でメモリから画像を読み込んだほうが使用メモリが多くなります
DXライブラリが使用している DirectX9 はデバイスロストという現象があり、
デバイスロストが発生するとそれまで作成していた Direct3D 用のテクスチャなどが全部
無効になってしまいます
( デバイスロストは主にフルスクリーンモードで起動している際に ALT+TABキー などで
プロセス切り替えが発生してデスクトップ画面に戻ったりした際に発生します )
その場合はテクスチャを1から作り直すことになるのですが、テクスチャの内容が何だったのかは
既に失われているので、画像データをどこかから再度調達してくる必要があります
ここで LoadGraph などでファイルから読み込んだ場合と CreateGraphFromMem などでメモリから
読み込んだ場合とでは処理が変わってきます
LoadGraph などの関数でファイルから読み込まれた画像は、画像ファイルのパスだけ保存しておき
デバイスロストが発生した際は保存しておいたパスから再度画像ファイルを読み込みます
CreateGraphFromMem などの関数でメモリから読み込まれた画像は、デバイスロスト発生時に
CreateGraphFromMem が呼ばれた時点で画像データが格納されていたメモリエリアに変わらず
画像データが存在する保証はありませんので、CreateGraphFromMem が呼ばれた際に渡された
画像データのコピーをDXライブラリ側でとっておき、デバイスロスト発生時はそれを使用します
LoadGraph はファイルパスだけを保存して、CreateGraphFromMem は画像データ自体を保存するので、
後者の方がメモリの使用量は多くなるというわけです
メモリ使用量を抑える方法としては、CreateGraphFromMem 実行時にDXライブラリ側に
データのコピーを保存せず、デバイスロスト発生時は自前で画像データを復帰する
というものがあります
まずコピーを保存させないためには DxLib_Init の後に SetUseGraphBaseDataBackup( FALSE ) ; を呼びます
これでDXライブラリ側にコピーが保存されなくなります
因みにファイルパスも保存されなくなるので、この機能を使用した場合は LoadGraph などの関数で
ファイルから読み込んだ画像ハンドルについても自前で復帰する必要があります
次に使用中の全ての画像ハンドルを削除して、再度画像ハンドルを作成する「引数なし、戻り値無し」の
関数を用意して、それをデバイスロストなどが発生してグラフィックハンドルの復帰が必要になった際に
呼ばれるコールバック関数を登録する関数 SetRestoreGraphCallback に作成した関数のアドレスを渡して
デバイスロスト発生時に呼ばれるようにします
// グラフィックハンドル復元関数を登録する
int SetRestoreGraphCallback( void (* Callback )( void ) ) ;
この関数を使用して画像データ復帰を実現するには各画像ハンドルがどのファイルを読み込んで作成したのか、
どのような設定で画像ハンドルを作成したのかなどの情報を自前で管理しておく必要があります
因みに SetRestoreGraphCallback で登録するコールバック関数が呼ばれた段階では画像ハンドルは
まだ存在していますので、登録する関数の最初で InitGraph を呼んで全画像ハンドルを削除するようにしてください
( 読み込み処理と共存できなくなりますが、画像ハンドルは有効なので InitGraph でリセットせずに
ReloadGraph などの再読み込み系の関数で画像情報を再読み込みさせることもできます )
 |
CreateGraphFromMemとLoadGraph ( No.3 ) |
- 名前:ひっとー(解決) 日時:2013/10/26 17:48
回答ありがとうございました。
早速試してみます
|