スポンサーサイト

-- --, --
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

フルスクリーンモードに切り替え

11 04, 2010
今、WinAPI、DirectXのウィンドウモードの切り替えの実装に向けて作業を進めていますが
先週のデバイスロストの恩恵もあり、なんなく切り替えができたんですけど

正しいアダプタモードを取得していなかったようで
学校の少し古めのPCで起動したところ ぷつんっ と即再起動してしまうというバグが発生しました。
理由は家にあるPCでは対応していた解像度でしたが
学校のPCでは対応しているディスプレイモードでは無かったためと思われます。

そこで、調べたところ IDirect3D9インターフェイスの
① GetAdapterDisplayModeでアダプタ現在のディスプレイモードを取得(フォーマット)
② GetAdapterModeCountで使用可能なディスプレイモード数を取得
③ ②で取得した回数分カウンタを回してEnumAdapterModesでディスプレイモード情報を取得

この一連の作業で現在のアダプタが対応しているディスプレイモード全ての
解像度(横幅、縦幅)、リフレッシュレート、フォーマットが取得できます。

これなら、情報を保持して安全なウィンドウモードの切り替えができそうですね
そんな感じで、ゲームと関係ないシステムの部分ですが 制作を進めています。
スポンサーサイト

デバイスロスト

10 28, 2010
・ウィンドウモード、フルスクリーンの切り替え
・フルスクリーン時にデクストップにフォーカスが移る
・スクリーンセイバーが発生

上のような事例が起こると描画のターゲットが失われるデバイスロストが発生する可能性があります。
つまり、スクリーンに何も描画されない状態になってしまうわけです。

これらをプログラマー側で対処しなければならないんですが、なかなか実装が難しいわけです。
なぜなら、IDirect3DDevice9のResetメソッドを呼び出せば良いだけの話ではなく
無効になってしまった規定のリソースをすべて解放し、しかるべき状態のときに
Resetメソッドを呼び出してデバイス情報を再設定して復旧を図ります。
そして、その後に解放したリソースを生成し直す
という非常にめんどくさい順序で処理をしなければなりません。

MSDNデバイスの消失
Maverick Projectさんのリストア処理
ゲームつくろー!さんのその52 デバイスのロストに対処する!

上記のサイト様が非常に参考になります。

自分も実装にの際に参考になりました 本当に有難うございました。
そんなデバイスロストですが、DirectX10、DirectX11から
デバイスロストになりにくいシステムに変更されているそうです。 とてもいい事ですね

以上、デバイスロストでした。
プロフィール

Gulatis

Author:Gulatis


2年目のひよっこなゲームプログラマー
嫌いなのはダブルポインター
TwitterSteamやってます。

記事の内容は主にDirectX9の話です。

ツイッター
カテゴリ
リンク
参考になった書籍


DirectXゲームグラフィックスプログラミング

基礎、概念がとてもわかりやすい


DirectX9必携

テクニック本 実際に使えます
購入予定の書籍


C++クラスと継承完全制覇

オブジェクト指向の考え方の地盤を固めたい


ゲームプログラマになる前に覚えておきたい技術

暇ができたら是非読みたい
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。