渲染循环中的CPU负载极高

时间:2016-03-20 21:30:06

标签: c# rendering render directx-11 sharpdx

我仍然在制作我的视频游戏和我自己的游戏引擎,并取得了很好的进展。本周末,我想花一些时间来改善游戏性能并检查是否有任何内存泄漏等问题。虽然大多数事情看起来很好,但我有一个令人难以置信的高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负载而不会通过线程休眠减慢渲染循环?

我很感激您的任何提示和帮助! : - )

1 个答案:

答案 0 :(得分:3)

简单地替换: _swapChain.Present(0, SharpDX.DXGI.PresentFlags.None);

通过

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

如MSDN Swapchain:Present doc所述:

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