【问题标题】:Extremely high CPU load in render loop渲染循环中的 CPU 负载极高
【发布时间】: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 负载而不用线程睡眠减慢渲染循环?

感谢您的任何提示和帮助! :-)

【问题讨论】:

标签: c# rendering render directx-11 sharpdx


【解决方案1】:

只需替换: _swapChain.Present(0, SharpDX.DXGI.PresentFlags.None);

通过

_swapChain.Present(1, SharpDX.DXGI.PresentFlags.None);

如 MSDN Swapchain:Present doc 中所述:

  • 0 - 演示立即发生,没有同步。
  • 1 到 4 - 在第 n 个垂直空白之后同步演示。

【讨论】:

  • 就是这样!非常感谢!我查看了昨天的样本,他们将此参数设置为一两个。我错过了这个细节:-/
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2012-05-14
相关资源
最近更新 更多