我刚刚阅读了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);
}
根据文档的那句话,这个循环将“启用最大并行度”。
通常这样做吗?订购这样的游戏循环有什么缺点吗?在第一次迭代之后我发现它没有真正的问题...我知道知道实际速度增加的最佳方法就是实际对它进行基准测试,但是还有其他人已经尝试过这个并且你可以证明任何实际的提速?
答案 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()更好一点,即使你正在进行的操作顺序是相同的。