読者です 読者をやめる 読者になる 読者になる

バッファリングによる描画遅延のサンプルプログラム

DirectX

(id:NyaRuRu:20050124#p2),(id:NyaRuRu:20050125#p1),(id:NyaRuRu:20050316#p3) などで取り上げた DirectX Graphics でのバッファリングによる描画遅延ですが,実際テスト用プログラムは作っていてそのうち公開でもしようかと思っていたら,既に NVSDK にちょうどいいサンプルが収録されていました.
http://download.developer.nvidia.com/developer/SDK/Individual_Samples/featured_samples.html#QuerySample
http://download.developer.nvidia.com/developer/SDK/Individual_Samples/DEMOS/Direct3D9/QuerySample.zip
GeForce 6800 + ForceWare 71.84, Display VSync@60Hz での実行結果を載せておきます.

D3DPRESENT_INTERVAL_IMMEDIATE 使用時

D3DPRESENT_INTERVAL_DEFAULT 使用時

682 FPS 出ているからといって「じゃあ 1.5 msec 以内に描画は完了するんだね」とは必ずしも言えないのがポイント.どちらも Timestamp [sec] × FPS の計算結果は 2 〜 3 [frame] *1となり描画命令発行から数フレーム遅れて描画が完了していることが分かります*2
また D3DPRESENT_INTERVAL_DEFAULT 使用時は一旦描画がキューイングされてしまうと以後は 60 FPSスループットでしかキューが減少しないため,たとえ GPU にアイドル状態が存在しても大きく遅延し続けていると考えられます.「東方永夜抄サポート掲示板」にあった「垂直同期を切ると遅延が解消」というのは,案外こういうからくりだったりしたのかもしれませんね.
http://www16.big.or.jp/~zun/cgi-bin/sbbsp/patio.cgi?mode=view&no=54

*1:0.004 * 682.67 -> 2.73068 [frame], 0.05 * 59.94 -> 2.997 [frame]

*2:本当はオシロなどで生信号追いかけて追試した方がいいんでしょうけど