トップページ > 記事閲覧
最近のバージョンでのデバイスロストについて
名前:sereparu 日時: 2017/10/09 01:43

デバイスロストについて確認させてください。 過去ログでデバイスロストについて調べると、2011〜2013年ごろの過去ログでは デバイスロストはフルスクリーンモード時に ALT+TAB でデスクトップ画面に戻されたときや、 ウインドウモード時で CTRL+ALT+DEL を押されたとき( こちらは偶に )などに発生します (参考元:dxlib.o.oo7.jp/cgi/patiobbs/patio.cgi?mode=view&no=3117) と書かれていたり、デバイスロストを防ぐ方法として、コールバック関数(SetGraphicsDeviceLostCallbackFunction) などが紹介されていますが、最近の記事(2017年)では デバイスロストについてはDXライブラリ内部で復帰処理を実装しているのでDXライブラリを使用される方が デバイスロストを気にされる必要はありません (参考元:dxlib.o.oo7.jp/cgi/patiobbs/patio.cgi?mode=view&no=4068) となっています。 これは、最近のバージョンでは、デバイスロストからの復帰処理がデフォルトで実装されているので 前述のようなデバイスロストは、コールバック関数などを使わなくても復帰できるという意味でしょうか? 更新履歴などを確認しましたが、そのようなことが明記されておらず、気になっていました。 実際、バージョン3.18cでは、前述のようなデバイスロストは発生しませんでした。 現在、実行ファイル起動時に、画面モードを「ウィンドウ」と「フルスクリーン」の2種類から選べるダイアログを表示させ、 一度だけChangeWindowModeを呼び出し、その後は画面モードは切り替えられない仕様のゲームを作っています。 ChangeWindowModeを最初に一度だけ呼び出す場合は特にデバイスロストは考慮しなくても問題ないでしょうか? また、画面モードが「ウィンドウ」の場合、ウィンドウサイズを「640x480」と「1280x960」から選べるようにして、 「1280x960」の場合は640x480サイズの空のグラフィックをMakeGraphで作成し、そこにゲーム画面を描画したものを DrawExtendGraphで1280x960に拡大して裏画面に表示させる仕様にしています。 MakeGraphのリファレンスを確認すると、デスクトップ画面に戻った場合に復元できないので SetRestoreGraphCallbackを使う必要がある、という旨の注意書きがありますが デスクトップ画面に戻ってもデバイスロストが発生しませんでした。 これは、たまたまデバイスロストしなかっただけで、やはりコールバック関数などの対策が必要なのでしょうか? 確認項目が多くなり恐縮ですが、ご回答をよろしくお願い致します。
メンテ

Page: 1 |

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を使おうと思います。 デバイスロストについても、疑問点が解消され、安心してゲーム制作に打ち込めます。 本当にありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存