【发布时间】:2016-03-20 21:30:06
【问题描述】:
我仍在开发我的视频游戏和我自己的游戏引擎,并且取得了不错的进展。这个周末,我想花一些时间来提高我的游戏性能并检查任何内存泄漏等等。虽然大多数情况看起来都不错,但我的 CPU 负载高达 45% 左右(在具有四个内核的 Intel i5 上)。首先,我认为我的一个模块中有一些非常糟糕的设计,但即使在从渲染过程中删除所有部分后,我的 CPU 负载仍然在 40% 左右!
这是删除所有模块的渲染调用后的渲染循环:
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);
等等,我的 CPU 负载下降到 10% 左右,即使我的所有游戏引擎模块都已激活。
但是,这不是我的游戏引擎可接受的最终解决方案。我花了一些时间在网上寻找 SharpDX 渲染循环示例,但我无法弄清楚其他人是如何处理这个问题的。
有什么方法可以避免高 CPU 负载而不用线程睡眠减慢渲染循环?
感谢您的任何提示和帮助! :-)
【问题讨论】:
-
除非您使用某种技术来限制 fps,否则您将拥有 100% 的 CPU 和可能的最大 fps。参见例如gamedev.stackexchange.com/q/68126 或 gamedev.stackexchange.com/q/51545.
标签: c# rendering render directx-11 sharpdx