トップページ > 記事閲覧
CreateGraphFromMemとLoadGraph
名前:ひっとー 日時: 2013/10/24 05:00

データを読み込む際に非同期でDXライブラリのミニテクのデータ圧縮とリファレンスの CreateGraphFromMemのサンプルにある暗号化を合わせたような圧縮暗号化したデータで読み込んでいるのですが 圧縮暗号化する前のデータを普通にLoadGraphで読み込んだ場合と使用メモリに結構な差が出てしまいます。 LoadGraphで読み込む場合とCreateGraphFromMem等の関数を使用して読む場合は メモリの使用量が変わってくるものなのでしょうか?それとも圧縮暗号をしたからなのでしょうか? 私のやり方が悪いだけかもしれませんけど読み込みに使ったメモリは解放しているはずなんですが・・・
メンテ

Page: 1 |

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

回答ありがとうございました。 早速試してみます
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存