DirectX:游戏循环顺序,首先绘制然后处理输入?

时间:2010-05-03 04:37:12

标签: directx game-loop

我刚刚阅读了DirectX文档,并在IDirect3DDevice9::BeginScene的页面中遇到了一些有趣的内容:

  

启用之间的最大并行度   CPU和图形加速器,   打电话是有利的   到目前为止, 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);
}

根据文档的那句话,这个循环将“启用最大并行度”。

通常这样做吗?订购这样的游戏循环有什么缺点吗?在第一次迭代之后我发现它没有真正的问题...我知道知道实际速度增加的最佳方法就是实际对它进行基准测试,但是还有其他人已经尝试过这个并且你可以证明任何实际的提速?

3 个答案:

答案 0 :(得分:2)

简短的回答是肯定的,这是通常的做法。在PS3上看看以下关于战争之神III游戏循环的演示:

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

如果你以30 fps的速度运行双缓冲游戏,则输入延迟将是1 / 30~ = 0.033秒,这是人类可以检测到的较小值(相比之下,任何反应时间都不到0.1秒) 100米被认为是错误的开始。)

答案 1 :(得分:2)

值得注意的是,在几乎所有的PC硬件上,BeginScene和EndScene都无能为力。事实上,驱动程序缓冲所有绘制命令,然后当你调用present时,它甚至可能不会开始绘制。它们通常缓冲几帧绘制命令以平滑帧速率。通常,驾驶员根据当前的呼叫来做事情。

当帧速率不是特别高时,这会导致输入延迟。

如果您在现在之前立即进行渲染,我会下注,您会注意到上面给出的循环没有区别。当然,在硬件的一些奇数位上,这可能会导致问题,因此,一般情况下,如上所述,最好不要进行循环。

答案 2 :(得分:2)

由于我总是觉得在sim之前画画是“尴尬的”,所以我倾向于将画面推到更新之后,而且也是在“现在”调用之后。 E.g。

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

虽然在第一帧上你没有任何翻转(你需要设置东西,以便第一次翻转确实翻转到已知状态),这总是让我感觉比放置Render()更好一点,即使你正在进行的操作顺序是相同的。