ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

CreativeStaffコミュの【プログラム班】 プログラム質問板

  • mixiチェック
  • このエントリーをはてなブックマークに追加
Rioさんにならってプログラム班の質問用スレ設置w

プログラムのことなら何でも来い(たぶんw)
DirectXでも大丈夫なはずだ
kuriboに降るかもしれん

というか答えられる人は答えてよ

コメント(16)

DirectXの仕様らしいですが。。。
フルスクリーンモードでプログラム起動中のお話。

おもむろにAlt+Tabを押す。
   ↓
ウィンドウ切り替える。
   ↓
再びAlt+Tabでプログラムを再開。
   ↓
するとどうでしょう、画面真っ黒!!!

読み込んだグラフィックがメモリから消えたとか?orz
回避方法伝授してくださいー
Alt+Tabでの切り替え…同じく、困らされています。一応、切り替えた後の復活は出来たのですが…orz

画面を表示させるタイミングでそれが失敗した場合、ロストしたのを再取得…と、以下のようなプログラムを書いても、アクティブに戻った後、もう一度モード切替を手動で発生させないと生き返ってくれません。しかも、ちゃっかりウインドウモード。

if ( hr == D3DERR_DEVICELOST ) の行と、if ( hr != D3DERR_DEVICENOTRESET ) の行を外すと、毎回判定されるのでアクティブになったら復帰してくれるのですが、挙動不審…。見た感じ、フルスクリーンの権限(?)のまま、ウィンドウモードに居座ってる感じです。

モードの記憶と、再設定に問題がある気がするのですが…。
それとも、ゲイツの陰謀か…。

原因が分かる方いらっしゃいましたら、ご指導願いますm(_ _)m


// --- 以下コードの一部( Render() 関数内 )
// ※ インデントが全部全角スペースになっています。

HRESULT hr;
hr = lpD3DDevice -> Present( NULL, NULL, NULL, NULL );

if ( FAILED(hr) ) {

 // アクティブでなかったら何もしないで関数を離脱
 // RUNNING は WM_ACTIVATE メッセージで返されたアクティブ状態を記憶しているフラグ
 if ( RUNNING == 0 ) return true;

 // まだロストしてたら関数を離脱
 if ( hr == D3DERR_DEVICELOST ) return true;

 // ロストしてないのに描画更新失敗してたら終了
 if ( hr != D3DERR_DEVICENOTRESET ) return false;

 // 再取得が必要なデバイスを一旦解放(モード切替と共用)
 CleanupD3DObj();

 // 画面モードによって、フォーマットの切り替え
 // FULLSCREEN は画面モードを記憶しているフラグ
 if ( FULLSCREEN == 0 )
  d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
 else d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;

 // リセット
 hr = lpD3DDevice ->Reset( &d3dpp );
 if ( FAILED(hr) ) {
  // それでも失敗したら
 }

 // さっき解放したのを再取得(モード切替と共用)
 InitD3DObj();
}
そうか・・・やんぴんでも悩める問題だったのか。

ていうか、DXライブラリもそこらへんカバーしてくれてればよかったんだけどなぁ。

どっちにしろ、自力かこれは。。
DXライブラリの場合は、画面モード変更した後、音や画像データを再読み込みすれば切り替え可能です〜

ウィンドウモード→フルスクリーンの場合は、

ChangeWindowMode( false );
SetGraphMode( width , height , colorDepth ) ;
SetDrawScreen( DX_SCREEN_BACK );
InitData(); // 最後に画像などの読み込みをやり直し

の様な感じで、逆の場合は ChangeWindowMode に true を渡します。
DXライブラリには登録しておくことでかってにやんぴんのいっていることをやってるれる関数があったはずなんだが詳しいことはよくわからないのよね
kuriboに聞くと答えてくれるかもよ

ちなみにDirectXはフルスクリーンから抜けるとグラフィックのハンドルを見失うらしい
こちらもよくわからん<最近DirectXもさわってないもんで
↑ただの役立たず
(・∀・)いつのまにやらこんなスレが!

えっとですね、すでにご存知かと思われますが
DIRECTXの仕様かグラボの仕様かで、フルスクリーン⇒ウィンドウに切り替わったり、色数を変えたり解像度を変えたりするとメモリ上に読み込んでいた画像データが壊れます。

で、方法としましては画面切り替え時に読み直すという方法しかないんですよね・・・

SetRestoreShredPoint(画像読み込み時に使う関数名);

とか使うとDXライブラリが画面変更行ったときになんとかしてくれるらしいが・・・
チョット怪しかったような気もする
気になるトピックがあったのでおもむろにコミュ入りしてみた.

フルスクリーン関連は私も詰まりました.
モード切り替えを行おうとするとなぜかループが終了してしまう.
あとフルスクリーン時のAlt+Tabでもループが終了しちゃったり.

もうウィンドウモードでだけで作っていきますわ.
DirextX 10 世代では、DirectX のデバイスが基本的にロストしなくなったそうで。(未確認情報ですが。

もしそうなら、スクリーンモードの切り替えなどで一々処理を書く苦労から解放されるのでは…と少し期待。本当のところ、どうなんでしょう?

自分で試すのは、Vistaマシンの調達予定の夏以降になりそうです…。
以下DXライブラリの更新履歴から抜粋。

『フルスクリーンモード時に ALT+TAB によるタスク切り替えで、選択タスクとして実行中のタスクを選択すると画面描画が一切行われなくなる不具合を修正。』(2007/4/21)

というわけで、この問題、DXライブラリ側も修正してくれたようです。
まだ自分では未確認ですが。

とりあえず、よかったー(汗)
使った事は無いですが、書き込みをば。

http://www.microsoft.com/japan/msdn/xna/
http://www.4gamer.net/games/032/G003263/20071213018/

公式のドキュメントの最初の方を読んだ感じだと、Xbox360用のゲームでなければ特別なことは必要ない…のかな…。。800ページものマニュアル、読む気が起きないです><;

簡単な2Dから、シェーダーまで一通りラップしてるみたいですし、C# が使えるなら、有力な選択肢になりそうな感じがしますね。(最新の機能には対応して無いようなので、最先端の機能を満喫したい時はあきらめてDirectX直打ちしかないようですね…)


C++ユーザの自分は、DXUT にもっと頑張ってもらいたいと思ってます。
質問ではないですが、先日の作業会で「DXライブラリ3D」が話題に上がっていたので、こちらにもリンクを張ってみマス。

http://fatalita.sakura.ne.jp/3DLib/

CS 内で圧倒的なシェアを誇る DX ライブラリを、DX ライブラリとは別の人が DirectX 9 で本家との互換性を保ちつつ作り直しているライブラリ。見た感じ、手軽さはかなりの物になりそうな予感はしますが、別の制作者という事で、DX ライブラリ並みの質のライブラリになるかは未知数かな…。

3D プログラミングをやってみたいけれど、DirectX を直打ちするのはキツぃという人は、記憶の片隅に名前を覚えとくといいかも?
今更ですがフルスクリーンでのデバイスロストからの復帰が成功しました
画像データ以外にも復帰が必要なものがありますね
D3DPOOL_DEFAULTフラグを指定して確保したビデオメモリリソースが対象だそうで
テクスチャだけでなくバッファも戻さないといけない

(デバイス)->TestCooperativeLevel()がD3DERR_DEVICENOTRESETを返さないと
復帰ができないそうです
自分で確かめてみてないからわからんけど

参考ページ
http://marupeke296.com/DXG_No52_DeviceLost.html

ログインすると、残り4件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

CreativeStaff 更新情報

CreativeStaffのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング