~■はじめにいろいろと忙しくて、こったネタに入れないので、手軽なプログラムをしてみました。Seconds)が固定されないことです。コンシューマ(家庭用)主体のわが国では、FPSを固定してプログラムするのに慣れている方が大半です。モーションブラーを効果的に使うには、FPS値が固定しているほうが望ましいと考えられます。一定にするプログラムを作ってみました。いつものようにプログラムです。9)ピクセルシェーダ2_0用ですが、まるで意味はありません。この後説明するプログラムをコピー&ペーストして、自分のプログラムに貼り付けてみてください。ソースには、いつものように適当にファイルが入っています。大事なソースは次のようになります。その走査が一番下まで言ってから上に帰ってくる間を「垂直帰線期間」といいます。この間にフロントバッファとバックバッファを差し替えることによって、ちらつきのない画面を再現しています。この間隔はディスプレイによって異なりますが、私が使っている液晶ディスプレイは60Hz(1秒間に60回の画面書き換えを行う)です。性能がよいディスプレイだと、より周波数が高くなっていることでしょう。60秒に1回書き換えるならば、それ以上の速さで描画したときにディスプレイで表示されない画面が発生してしまいます。これは無駄なので、描画以外の別の処理や別のアプリケーションにCPUなどのパワーを受け渡したいとことです。一定になると、アニメーションの処理などが簡単になるといった別の側面もあります。調べて、まだ垂直帰線期間中になければ、別の処理に負荷を明け渡せば実現できます。出力先)が用意されています。最初の引数のIDは、マルチヘッドディスプレイのための識別IDです。メンバ「InVBlank」をみます。現在書き込んでいる走査線の値が格納されるので、負荷を予想するのに便利でしょう。ディスプレイ等によってサポートされない場合があるらしいので、今回のプログラムを使えば完璧かどうかはわかりません。GetRasterStatusを呼び出す場所ですが、画面を更新する「Present」関数の直前で呼び出して調べます。関数呼び出しがPresent関数よりもはるか前だと、その後の処理が垂直帰線期間を飛び越える可能性があるので、注意が必要です。アプリケーションウィザードを使ったプログラムの場合は、Render関数の最後でGetRasterStatusによる調査をおこなえばよいです。今回のプログラムでは、GetRasterStatusの呼び出しで無限ループをかけて無駄にCPUを使っています。休ませたり、他の処理を呼び出すなりしてください。所得失敗!本当はどうするのですかねぇ。過度に期待しないでください。11)cozさんから、FPSを一定にする方法ですが、DirectX9では、D3DPRESENT_INTERVAL_DEFAULTなどに設定すればいいと思うんですが、そういうことではないんですか?というお言葉をいただきました。下のプログラムのように変更して試してみました。);確かに、同じような効果が得られますね。fixing]についてなのですが、最後のほうでD3DPRESENT_INTERVAL_DEFAULTについて記述があります。たしかにD3DPRESENT_INTERVAL_DEFAULTを設定するとFPSは固定されるのですが、うちの液晶では少しちらついてしまいます。これはタイマーの精度が低いのが原因なようで、timeBeginPeriod(1);で精度を上げてやれば問題なく働きます。いうお言葉をいただきました。完璧ではないということなので、過信しないようにしましょう。もどるimagire@gmail.com。