5

DirectXのドキュメントを読んでいて、IDirect3DDevice9 :: BeginSceneのページで何か面白いものに遭遇しました:

CPUとグラフィックアクセラレータ間の最大の並列処理を有効にするには、 presentを呼び出す前にIDirect3DDevice9::EndSceneを呼び出すことが有利です。

私は、入力などを処理してから描画するゲームループを作成することに慣れています。私はそれを逆に持っていますか?たぶん、ゲームループはもっと次のようになるはずです:(半擬似コード、明らかに)

while(running) {
    d3ddev->Clear(...);
    d3ddev->BeginScene();
    // draw things
    d3ddev->EndScene();

    // handle input
    // do any other processing
    // play sounds, etc.

    d3ddev->Present(NULL, NULL, NULL, NULL);
}

ドキュメントのその文によると、このループは「最大の並列処理を可能にする」でしょう。

これは一般的に行われますか?このようなゲームループを注文することの欠点はありますか?最初の反復の後、実際の問題は見られません...そして、このようなものの実際の速度の増加を知る最良の方法は、実際にベンチマークすることですが、他の誰かがすでにこれを試したことがあり、実際の速度を証明できますか?スピードアップ?

4

3 に答える 3

2

簡単な答えは「はい」です。これが一般的な方法です。PS3のゴッドオブウォーIIIのゲームループに関する次のプレゼンテーションをご覧ください。

http://www.tilander.org/aurora/comp/gdc2009_Tilander_Filippov_SPU.pdf

30 fpsでダブルバッファリングされたゲームを実行している場合、入力ラグは1/30〜= 0.033秒になります。これは、人間が検出するには小さすぎます(比較のために、100メートルで0.1秒未満の反応時間は不正スタートと見なされます)。

于 2010-05-03T05:14:14.753 に答える
2

ほぼすべてのPCハードウェアでBeginSceneとEndSceneは何もしないことに注意してください。実際、ドライバはすべての描画コマンドをバッファリングし、presentを呼び出すと、描画を開始しない場合があります。これらは通常、フレームレートを滑らかにするために、描画コマンドのいくつかのフレームをバッファリングします。通常、ドライバーは現在の呼び出しに基づいて処理を行います。

これにより、フレームレートが特に高くない場合に、入力遅延が発生する可能性があります。

現在の直前にレンダリングを行った場合、上記のループに違いはないことに気付くでしょう。もちろん、ハードウェアのいくつかの奇妙なビットでは、これが問題を引き起こす可能性があるため、一般的には、上記のようにループするのが最善です。

于 2010-05-03T08:23:24.350 に答える
2

シムの前にドローするのは「ぎこちない」といつも感じていたので、アップデート後だけでなく「現在の」コールの後までドローをプッシュする傾向がありました。例えば

while True:
   Simulate()
   FlipBuffers()
   Render()

最初のフレームでは何も反転していませんが(最初の反転が実際に既知の状態に反転するように設定する必要があります)、Render()を最初に配置するよりも、これは常に少し良いと思いました。作業を開始すると、操作の順序は同じになります。

于 2010-05-03T19:44:54.870 に答える