我刚刚阅读了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);
}
Run Code Online (Sandbox Code Playgroud)
根据文档的那句话,这个循环将"启用最大并行性".
这常见吗?订购这样的游戏循环有什么缺点吗?在第一次迭代之后我发现它没有真正的问题...我知道知道实际速度增加的最佳方法就是实际对它进行基准测试,但是还有其他人已经尝试过这个并且你可以证明任何实际的提速?
由于我一直觉得在 sim 之前进行绘制是“尴尬的”,所以我倾向于将绘制推到更新之后,但也在“当前”调用之后。例如
while True:
Simulate()
FlipBuffers()
Render()
Run Code Online (Sandbox Code Playgroud)
虽然在第一帧上你没有翻转任何东西(并且你需要设置一些东西,以便第一次翻转确实翻转到一个已知的状态),这总是让我觉得比把 Render() 首先更好一点,尽管开始后,操作顺序是相同的。