我仍在开发视频游戏和自己的游戏引擎,并且取得了不错的进步。这个周末,我想花一些时间来改善游戏性能,并检查是否有内存泄漏等。虽然大多数情况看起来不错,但我的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负载而又不会由于线程睡眠而减慢渲染循环的速度?

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

最佳答案

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

通过

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

如MSDN Swapchain:Present文档所述:


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

关于c# - 渲染循环中的CPU负载极高,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36119847/

10-12 17:18