Re: 最近のバージョンでのデバイスロストについて ( No.1 ) |
- 名前:sereparu 日時:2017/10/09 14:10
すみません。開発環境を書き忘れていました。
以下のとおりです。
OS:Windows7(64bit) Home Premium SP1
統合開発環境:Visual Studio Community 2017
コンパイラ:Visual C++ 2017
ライブラリ:DXライブラリVer3.18c
|
Re: 最近のバージョンでのデバイスロストについて ( No.2 ) |
- 名前:管理人 日時:2017/10/09 23:02
> これは、最近のバージョンでは、デバイスロストからの復帰処理がデフォルトで実装されているので
> 前述のようなデバイスロストは、コールバック関数などを使わなくても復帰できるという意味でしょうか?
いえ、昔から特定のケースを除いてデバイスロストが発生してもコールバック関数を使用しなくても
グラフィックハンドルとその内容は復帰するようになっています
コールバック関数を使用して対処する必要があるケースは
・MakeScreen で作成した仮画面の描画結果
MakeScreen で作成した仮画面のグラフィックハンドルは復帰されますが、内容は復元されないので
コールバック関数で内容を自前で復元する必要があります( 毎フレーム描画するようなケースでは問題ありません )
・LoadGraph などで読み込んだ画像ファイルを削除したりファイル名を変更したりした場合
グラフィックハンドルを LoadGraph や LoadDivGraph 等でファイルから読み込んだ場合は復帰の際に
同じファイルから画像を再度読み込もうとするのですが、読み込みに使用した画像を読み込み後に
削除したりリネームしていたりしていた場合はファイルを見つけることができず自動復帰ができないので、
この場合もコールバック関数で自前で復元する必要があります
この条件は昔のバージョンから変わっていません
> MakeGraphのリファレンスを確認すると、デスクトップ画面に戻った場合に復元できないので
> SetRestoreGraphCallbackを使う必要がある、という旨の注意書きがありますが
> デスクトップ画面に戻ってもデバイスロストが発生しませんでした。
グラフィックハンドルは無効にはなりませんが、内容は元の状態が保たれていないと思います
( グラフィックスデバイスやドライバの関係でたまたまロスト前と全く同じ内容が保たれることも
あるかもしれませんが、それはあくまで偶然のもので、保証されている動作ではありません )
> これは、たまたまデバイスロストしなかっただけで、やはりコールバック関数などの対策が必要なのでしょうか?
上記の2条件に当てはまらなければコールバック関数を使用した対策をされなくても大丈夫です
|
Re: 最近のバージョンでのデバイスロストについて ( No.3 ) |
- 名前:sereparu 日時:2017/10/10 22:37
管理人さん
迅速なご回答、誠にありがとうございます。
DXライブラリはもともとデバイスロストから復帰できる仕様だったんですね。
勘違いしていました、すみません。
> MakeScreen で作成した仮画面のグラフィックハンドルは復帰されますが、内容は復元されないので
> コールバック関数で内容を自前で復元する必要があります( 毎フレーム描画するようなケースでは問題ありません )
ゲーム画面を毎フレーム描画しているので、問題なかったのだと思います。
ちなみに、MakeGraphとMakeScreenでは何か違いが出るでしょうか?
現在は下記参照元に書かれているソースコードをほぼそのまま使っているため
MakeGraphを使っているのですが、MakeScreenの方が良いでしょうか?
(参照元:dxlib.o.oo7.jp/cgi/patiobbs/patio.cgi?mode=past&no=1287)
主旨から外れてしまいますが、MakeGraphとMakeScreenの違いは
UseAlphaChannelが引数にあるかないかだけでしょうか?
MakeScreenのリファレンスでは「MakeGraph で作成できるグラフィックハンドルとの違いは
SetDrawScreen の引数として渡せるか渡せないか」と書いてありますが
MakeGraphで作成したグラフィックハンドルでも、SetDrawScreenの引数として渡すことができ
描画結果も特に問題なかったので、そのまま使っているのですが、少し気になりました。
MakeGraphで作成したものをSetDrawScreenに渡すのは良くないでしょうか?
> LoadGraph などで読み込んだ画像ファイルを削除したりファイル名を変更したりした場合
使用する画像は全てdxaファイルにまとめてあり、ゲーム処理中に削除したり
ファイル名を変更したりすることはないので、こちらは問題ないと思います。
|
Re: 最近のバージョンでのデバイスロストについて ( No.4 ) |
- 名前:管理人 日時:2017/10/11 01:31
> ちなみに、MakeGraphとMakeScreenでは何か違いが出るでしょうか?
MakeScreen は MakeGraph のヘルパー関数で、例えば
// 描画対象にすることができてアルファチャンネルもあるグラフィックハンドルの作成
drawscreen = MakeScreen( 640, 480, TRUE ) ;
↑こちらの処理は、以下の処理と同じです
// 変更前の設定を保存
int DrawValidGraphCreateFlag = GetDrawValidGraphCreateFlag() ;
int DrawValidAlphaChannelGraphCreateFlag = GetDrawValidAlphaChannelGraphCreateFlag() ;
// 描画対象にすることができてアルファチャンネルもある画像を作成する指定を行う
SetDrawValidGraphCreateFlag( TRUE ) ;
SetDrawValidAlphaChannelGraphCreateFlag( TRUE ) ;
// グラフィックハンドルの作成
drawscreen = MakeGraph( 640, 480 ) ;
// 設定を元に戻す
SetDrawValidAlphaChannelGraphCreateFlag( DrawValidAlphaChannelGraphCreateFlag ) ;
SetDrawValidGraphCreateFlag( DrawValidGraphCreateFlag ) ;
作成するグラフィックハンドルのフォーマットを指定するための関数が増えすぎたので、
「よく使う『SetDrawScreen で描画対象にできるグラフィックハンドル』くらいは1つの関数で作成できるようにしよう」
と思って追加したのが MakeScreen です
> MakeGraphを使っているのですが、MakeScreenの方が良いでしょうか?
前述の通り行っている処理は同じなので、どちらでも大丈夫です
> MakeGraphで作成したものをSetDrawScreenに渡すのは良くないでしょうか?
前述の通り SetDrawValidGraphCreateFlag に TRUE を渡して呼んだ状態で作成したグラフィックハンドルは
MakeScreen で作成したものと同じなので SetDrawScreen に渡しても問題ありません
尚、MakeGraph の前に SetDrawValidGraphCreateFlag に TRUE を渡して呼んでいない状態で作成したグラフィックハンドルの
性質は LoadGraph で作成したグラフィックハンドルと同じなので SetDrawScreen に引数として渡してもエラーになります
|
Re: 最近のバージョンでのデバイスロストについて ( No.5 ) |
- 名前:sereparu(解決) 日時:2017/10/12 04:30
管理人さん
いつも丁寧なご回答、誠にありがとうございます。
MakeScreenはMakeGraphを使いやすいように改良したものなんですね。
書く処理が少なくて済むので、MakeScreenを使おうと思います。
デバイスロストについても、疑問点が解消され、安心してゲーム制作に打ち込めます。
本当にありがとうございました。
|