Rakuten Card
Rakuten
Infoseek
Service
DirectX9.0cで現在プログラムを作成しているのですが、フルスクリーンモードにすると激しくちらついてしまいます。何が原因なのか全く見当がつきません、ウェイトなしでループを回しているとはいえ、参考書のサンプルもウェイトなしでループを回しているのにちらついたりしておりません。どうかご教授願えればと…。http://abyss-22.hp.infoseek.co.jp/ScriptPlayer2.zip
原因はVSYNC待ちしてないからだと思いますm_D3DParamWin.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;をm_D3DParamWin.PresentationInterval = D3DPRESENT_INTERVAL_ONE;に変えたらなおりませんか?これは要るか覚えてないですが上を変えてm_D3DParamWin.SwapEffect = D3DSWAPEFFECT_DISCARD;をm_D3DParamWin.SwapEffect = D3DSWAPEFFECT_COPY;に変える垂直同期のことは日本語マニュアルに書いてありますのでそちらを見てみることをお勧めしますあとはサンプルDXUTを見ればいいかと思います
ありがとうございます、D3DSWAPEFFECT_COPYに変えたらちらつきがなくなりました。D3DPRESENT_INTERVAL_ONEは質問する前に試してみたのですが、ちらつきが消えませんでした。不思議なのは、参考書(DirectX9実践プログラミング)のサンプルでは、同じD3DSWAPEFFECT_DISCARDとD3DPRESENT_INTERVAL_IMMEDIATEを指定しているのにちらつかないところです。こちらもサンプルも、ウェイトは全く入れていないのに………。これは、サンプルのD3DSWAPEFFECT_DISCARDではD3DSWAPEFFECT_COPYが選ばれているという解釈でいいのでしょうか?
追記です、D3DPRESENT_INTERVAL_IMMEDIATEのままでD3DSWAPEFFECTを色々と試してみました。D3DSWAPEFFECT_DISCARD:ウインドウモードはちらつかず、フルスクリーンモードはちらつくD3DSWAPEFFECT_COPY:ウインドウモードはちらつかず、フルスクリーンモードもちらつかないD3DSWAPEFFECT_FLIP:ウインドウモードはちらつき、フルスクリーンモードもちらつくこの結果から考えるに、サンプルのD3DSWAPEFFECT_DISCARDはウインドウモード・フルスクリーンモード共にD3DSWAPEFFECT_COPYが呼ばれており、こちらのD3DSWAPEFFECT_DISCARDはウインドウモードでD3DSWAPEFFECT_COPY、フルスクリーンモードでD3DSWAPEFFECT_FLIPが呼ばれているようです。何故、そのように変わるのかが分かりませんが…。
原因はDX9AGraphics::AppIdle()のPresent()呼び出しですね。この位置にPresent()は必要ないと思います。
もう少し詳しく説明しておきます。今回は1回のループでPresentが2回呼ばれていて、そのうちの1回はバックバッファを全く初期化していないことが問題でした。D3DSWAPEFFECT_DISCARDはPresent()を呼んだ後のバックバッファの内容が保証されません。そのために、ランタイムやドライバが一番都合のいい方法でフロントバッファを更新できます。一般的にウインドウモードでは内容のコピー、フルスクリーンモードではバッファの入れ替え(バックバッファとフロントバッファを指すポインタを交換)が使われます。このようなバグを発見しやすくするために、DirectXのデバッグランタイムでは、D3DSWAPEFFECT_DISCARDでPresent()を呼んだときに必ずバックバッファの内容を破壊します。このプログラムでも、デバッグランタイムで実行するとウインドウモードでもチラつきが発生します。デバッグ中は、デバッグランタイムを使用した方がいいですよ。
ありがとうございます、原因が理解できました!1ループ中で2回呼んでたらちらつくのも当然ですね、パラメータ周りばかりを見ていてのケアレスミスでした。デバッグモードにはデバッグランタイムですね、重ね重ねありがとうございます。