シューティングゲーム製作技術総合 7機目
■ このスレッドは過去ログ倉庫に格納されています
0331名前は開発中のものです。
2005/04/18(月) 16:27:09ID:OZHdU4AJ3Dデモを作ったら重すぎて今までの処理では追い付かないらしく試行錯誤。
んで副産物でこんなことを推論したのだけど間違ってたら教えてください。
D3DPRESENT_DEFAULTでt-potのFPS固定化の処理
do {
dev->GetRenderState(D3DADAPTER_DEFAULT,&status);
} while( !status->InVBlank );
dev->Present(NULL,NULL,NULL,NULL);
を入れてみたらウィンドウ時は60FPSだったのがフルスクリーン時に30FPSに落ちた。
しかし上3行をコメントアウトするとフルスクリーンでも60FPSで動く。
GetRenderStateの呼び出しのしすぎかと思ってSleep(1)を挟むが全く効果なし。
この結果から実はPresentは処理をすぐに返す関数なのではと予想。
ドライバが内部スレッドで垂直帰線期間を待ちバックバッファとフロントバッファを入れ替える。
上みたいに垂直帰線期間をメインスレッドで待つと次フレームの処理が出来ずに、
その結果が30fpsになっているのではないかと。
軽い処理の時に特別な処理をせずともPresentのみで60fpsに固定されるのは、
フロントバッファとバックバッファの両方がキューに入っていて、
フロントバッファをディスプレイに映さないまま差し替えるわけにいかないから、
多分ドライバがそこで待機してるんだと思う。
クソ軽いゲームを作るときにPresentのみでFPSの固定化をすると
何故か入力に1フレームの遅延が起こっていたのは多分このせいだと思う。
(フロントバッファとバックバッファの2枚がドライバ内部にあるため)
特に以前の東方の入力遅延は多分この辺からきてるのではないかな。
あれもCPU使用率100%になってたし。
■ このスレッドは過去ログ倉庫に格納されています