トップページ > 記事閲覧
デバイスロスト時のMakeScreenで作った画像について
名前:たろう 日時: 2019/08/15 16:04

いつもすみません、たろうです フルスクリーンでゲームを表示時に、Alt+Tabなどでフォーカスを失うと 復帰した後はLoadGraphなどで読み込んだものと違い、 MakeScreenで作った画像などは回復できずに消えてしまいますが、 @これを回避する方法はなにかありますでしょうか? Aまたこの現象はandroid版も同じことが起こるのでしょうか? かなり以前同じような質問をさせていただき 疑似フルスクリーンで対処することにした気がしますが これ自体も何か方法があれば改善したいと思い またandroid版はまだ使った事がないのですが、 そのまま移植すると、より深刻な問題が起こりそうなので ダメもとで質問させていただこうと思いました。 もしあればアドバイスを頂けると助かります よろしくお願いいたします<(_ _)>
メンテ

Page: 1 |

Re: デバイスロスト時のMakeScreenで作った画像について ( No.1 )
名前:管理人 日時:2019/08/16 02:18

> @これを回避する方法はなにかありますでしょうか? Direct3D 11 を使用する場合に限り、DxLib_Init の前に SetChangeScreenModeGraphicsSystemResetFlag( FALSE ); を実行しておくと、Alt+Tabなどでフォーカスを失ってデスクトップに戻ったりするくらいではデバイスロスト扱いに ならず、画像の欠落がしなくなります( グラフィックスドライバのアップデートなどをするとロストします ) ただ、Direct3D 9 を使用して動作している場合は回避する方法はありません > Aまたこの現象はandroid版も同じことが起こるのでしょうか? はい、android版はより頻繁に発生します( 電源ボタンを押して画面表示を一時的にOFFにするだけでも 発生することも多く、一時的に別のアプリに切り替えるだけでも発生することがあります ) なので、MakeScreen で作成した画像は、あくまで一時的な画像を保持しておくものとして 考えていただいた方が良いです
メンテ
Re: デバイスロスト時のMakeScreenで作った画像について ( No.2 )
名前:たろう 日時:2019/08/16 18:34

ご返信いただきありがとうございます。 ウィンドウズ版は、SetGraphicsDeviceLostCallbackFunctionで監視して デバイスロストした場合にすべて画像を作り直す仕組みにしようと思っているのですが @このような方法で作ったゲームをandroid版に移植した場合に 例えばSetGraphicsDeviceLostCallbackFunctionのような方法がないなど 何か問題はありますでしょうか? Aデバイスロスト関連でMakeScreen以外に影響があるものは他にありますでしょうか? Bデバイスロスト後復帰時に消えた画像(MakeScreenで作ったもの)のハンドルに 同じ画像を入れなおす(作りなおす)際には、画像が消えたとはいえ、 まずそのハンドルに対してDeleteGraphをしようと思いますが、問題ありますでしょうか? たびたびすみません、特にandroid版は使ったことが無いのですが 後に移植しようとしたときに不可能な仕組みで作ってしまうと大変なので、 教えていただけると助かります。 よろしくお願いいたします<(_ _)>
メンテ
Re: デバイスロスト時のMakeScreenで作った画像について ( No.3 )
名前:管理人 日時:2019/08/17 04:33

> ウィンドウズ版は、SetGraphicsDeviceLostCallbackFunctionで監視して > デバイスロストした場合にすべて画像を作り直す仕組みにしようと思っているのですが デバイスロストした際の画像作り直しをする場合は SetGraphicsDeviceLostCallbackFunction ではなく SetGraphicsDeviceRestoreCallbackFunction を使用するようにしてください ( SetGraphicsDeviceLostCallbackFunction で登録したコールバック関数が呼ばれたタイミングではまだ 画像を作り直すことができないので ) > @このような方法で作ったゲームをandroid版に移植した場合に > 例えばSetGraphicsDeviceLostCallbackFunctionのような方法がないなど > 何か問題はありますでしょうか? 前述の通り SetGraphicsDeviceLostCallbackFunction の代わりに SetGraphicsDeviceRestoreCallbackFunction を使用してください SetGraphicsDeviceRestoreCallbackFunction であれば、android版でも復帰時に登録したコールバック関数が呼ばれます > Bデバイスロスト後復帰時に消えた画像(MakeScreenで作ったもの)のハンドルに > 同じ画像を入れなおす(作りなおす)際には、画像が消えたとはいえ、 > まずそのハンドルに対してDeleteGraphをしようと思いますが、問題ありますでしょうか? 問題ありません( 寧ろ DeleteGraph をしないと駄目です )
メンテ
Re: デバイスロスト時のMakeScreenで作った画像について ( No.4 )
名前:たろう 日時:2019/08/17 07:10

いつもアドバイスをありがとうございます。 SetGraphicsDeviceRestoreCallbackFunction で監視する仕組みで作っていこうと思います。 あともう一つすみませんMakeScreenで作成した画像以外に デバイスロストで失われる可能性のあるものはありますでしょうか? 例えばDerivationGraphなどは影響がないようですが 使用環境によって影響があると困るので 教えていただけると助かります。 お忙しいところたびたびすみません、 よろしくお願いいたします<(_ _)>
メンテ
Re: デバイスロスト時のMakeScreenで作った画像について ( No.5 )
名前:管理人 日時:2019/08/18 01:45

MakeScreen で作成した画像以外では、リファレンスに載っていない関数ですが CreateVertexBuffer, CreateIndexBuffer で作成した頂点バッファ、インデックスバッファの内容も消えます
メンテ
Re: デバイスロスト時のMakeScreenで作った画像について ( No.6 )
名前:たろう(解決) 日時:2019/08/18 02:04

ご返信いただきありがとうございます。 使うときは気を付けたいと思います。 お手数をおかけいたしました ありがとうございましたm(__)m
メンテ
Re: デバイスロスト時のMakeScreenで作った画像について ( No.7 )
名前:たろう 日時:2019/08/18 14:42

すみません、解決をつけてしまいましたが、関連でまた疑問が出てしまいましたので 引き続き失礼いたします。 別スレッドの質問の関連でDXライブラリをVer 3.19e→Ver 3.20fにしたところ、 Alt+Tabや別モニタ領域をクリックするなどしてもデバイスロストしなくなってしまいました。 Log.txtを見ると「Direct3D 11 FeatureLevel 11_0 以上を対象とします」とあるのですが SetChangeScreenModeGraphicsSystemResetFlag( FALSE );は実行していません。 @DXライブラリのバージョンが違う以外は全く同じ環境なのですが、これは Direct3D 11を使う環境だった場合は、自動で SetChangeScreenModeGraphicsSystemResetFlag( FALSE ); になる仕様に変更になったという事でしょうか? (※SetChangeScreen〜( TRUE );としてもやはりデバイスロストしないので、そうなると SetChangeScreen〜( FALSE );は不要という事でしょうか?) ADirect3D 9 を使用するかDirect3D 11 を使用するかについては、 DXライブラリ側で11を使えたら11に、使えない場合は9を選んで使っている という事でしょうか、(※常識かもわかりませんが、全く無知ですみません) Bデバイスロストする場合の動きをプログラミングする場合は、DXライブラリを古いバージョンと 取り換えて試す必要がありますが、例えば意図的に古いバージョンのDXライブラリのように ALT+TAB時にデバイスロストする仕様に戻す関数などはありますでしょうか? ながながとすみません、よろしくお願いいたします<(_ _)>
メンテ
Re: デバイスロスト時のMakeScreenで作った画像について ( No.8 )
名前:管理人 日時:2019/08/19 00:11

> @DXライブラリのバージョンが違う以外は全く同じ環境なのですが、これは > Direct3D 11を使う環境だった場合は、自動で > SetChangeScreenModeGraphicsSystemResetFlag( FALSE ); > になる仕様に変更になったという事でしょうか? すみません、記憶違いをしていました 現在は SetChangeScreenModeGraphicsSystemResetFlag( FALSE ); を実行しなくても Direct3D 11 を 使用している場合は早々デバイスロスト処理が実行されないようになっています ( SetChangeScreenModeGraphicsSystemResetFlag( FALSE ); を実行すると、SetGraphMode などを 使用してもデバイスの削除が行われなくなる、でした ) > ADirect3D 9 を使用するかDirect3D 11 を使用するかについては、 > DXライブラリ側で11を使えたら11に、使えない場合は9を選んで使っている > という事でしょうか、(※常識かもわかりませんが、全く無知ですみません) はい、その通りです > Bデバイスロストする場合の動きをプログラミングする場合は、DXライブラリを古いバージョンと > 取り換えて試す必要がありますが、例えば意図的に古いバージョンのDXライブラリのように > ALT+TAB時にデバイスロストする仕様に戻す関数などはありますでしょうか? DxLib_Init を呼ぶ前に SetUseDirect3DVersion( DX_DIRECT3D_9EX ); を実行すると強制的に Direct3D 9 を使用するようにすることができますので、それでデバイスロストでの動作を 確認することができます
メンテ
Re: デバイスロスト時のMakeScreenで作った画像について ( No.9 )
名前:たろう(解決) 日時:2019/08/19 01:24

ご返信いただきありがとうございます。 SetUseDirect3DVersion( DX_DIRECT3D_9EX ); を使用することで、デバイスロストする場合の 処理の確認がスムーズに出来そうです。 お忙しいところお手数をおかけいたしました。 ありがとうございました。<(_ _)>
メンテ

Page: 1 |

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

   クッキー保存