我仍然在制作我的视频游戏和我自己的游戏引擎,并取得了很好的进展。本周末,我想花一些时间来改善游戏性能并检查是否有任何内存泄漏等问题。虽然大多数事情看起来很好,但我有一个令人难以置信的高CPU负载约45%(在带有四个内核的Intel i5上)。首先,我认为我的一个模块中有一些非常糟糕的设计,但即使从渲染过程中删除所有部件后,我仍然有大约40%的CPU负载!
在删除所有模块的渲染调用后,这是我的渲染循环:
public void Run()
{
_logger.BeginFunction(this.ToString(), "Run");
RenderLoop.Run(Form, () =>
{
_deviceContext.ClearDepthStencilView(_depthView, SharpDX.Direct3D11.DepthStencilClearFlags.Depth, 1.0f, 0);
_deviceContext.ClearRenderTargetView(_renderTargetView, Color.Black);
_swapChain.Present(0, SharpDX.DXGI.PresentFlags.None);
});
OnApplicationClosing();
_logger.EndFunction();
}
所以,你可以看到几乎没有任何反应,我仍然有40%的CPU负载。我检查了,如果有任何东西在后台运行,则每隔5秒打印一次当前堆栈跟踪。在我禁用了所有游戏引擎的模块之后,这个过程中没有任何东西在运行。
然后我记得多年前我在学习期间遇到类似的问题,当时计算线程处于无限循环中。由于循环没有减慢,因此它尽可能快地执行,这导致高CPU负载。记住这一点,我在上面的渲染循环结束时添加了一条丑陋的行:
System.Threading.Thread.Sleep(10);
Etvoilà,我的CPU负载下降到10%左右,即使我的所有游戏引擎模块都已激活。
但是,对于我的游戏引擎来说,这不是一个可接受的最终解决方案。我花了一些时间在线查看SharpDX渲染循环示例,但我无法弄清楚其他人如何处理这个问题。
有没有办法避免高CPU负载而不会通过线程休眠减慢渲染循环?
我很感激您的任何提示和帮助! : - )
答案 0 :(得分:3)
简单地替换:
_swapChain.Present(0, SharpDX.DXGI.PresentFlags.None);
通过
_swapChain.Present(1, SharpDX.DXGI.PresentFlags.None);
如MSDN Swapchain:Present doc所述: