渲染循环中的极高 CPU 负载
Extremely high CPU load in render loop
我仍在开发我的视频游戏和我自己的游戏引擎,并且取得了不错的进展。这个周末,我想花一些时间来提高我的游戏性能并检查是否有任何内存泄漏等等。虽然大多数情况看起来都不错,但我的 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);
Et voilà,我的 CPU 负载下降到 10% 左右,即使我所有的游戏引擎模块都已激活。
但是,这不是我的游戏引擎可以接受的最终解决方案。我花了一些时间在网上寻找 SharpDX 渲染循环示例,但我无法弄清楚其他人是如何处理这个问题的。
有什么方法可以避免高 CPU 负载而不用 线程休眠 减慢渲染循环?
非常感谢您的任何提示和帮助! :-)
只需替换:
_swapChain.Present(0, SharpDX.DXGI.PresentFlags.None);
来自
_swapChain.Present(1, SharpDX.DXGI.PresentFlags.None);
如 MSDN Swapchain:Present 文档所述:
- 0 - 演示立即发生,没有同步。
- 1 到 4 - 在第 n 个垂直空白之后同步演示文稿。
我仍在开发我的视频游戏和我自己的游戏引擎,并且取得了不错的进展。这个周末,我想花一些时间来提高我的游戏性能并检查是否有任何内存泄漏等等。虽然大多数情况看起来都不错,但我的 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);
Et voilà,我的 CPU 负载下降到 10% 左右,即使我所有的游戏引擎模块都已激活。
但是,这不是我的游戏引擎可以接受的最终解决方案。我花了一些时间在网上寻找 SharpDX 渲染循环示例,但我无法弄清楚其他人是如何处理这个问题的。
有什么方法可以避免高 CPU 负载而不用 线程休眠 减慢渲染循环?
非常感谢您的任何提示和帮助! :-)
只需替换:
_swapChain.Present(0, SharpDX.DXGI.PresentFlags.None);
来自
_swapChain.Present(1, SharpDX.DXGI.PresentFlags.None);
如 MSDN Swapchain:Present 文档所述:
- 0 - 演示立即发生,没有同步。
- 1 到 4 - 在第 n 个垂直空白之后同步演示文稿。