自从我将我的所有 c# SlimDX DX11 渲染代码从我的表单(是的,我是一个懒惰的开发人员)移动到定制类后,我最近有点滞后。我将我的程序打进了 EQATEC Profiler 并把它作为我滞后的主要贡献者:
现在很清楚, postRender() 中的任何内容都真正占用了宝贵的毫秒数。事实上,无论我在其中有什么疯狂、复杂的代码,它本身都会有效地将我的帧速率降低到 ~15 FPS。
那么 postRender() 中有什么?只需一行代码:
swapChain.Present(0, PresentFlags.None);
我只是不知道是什么导致它这么慢,我根本没有对交换链代码进行任何更改。我所更改的只是屏幕分辨率(1680x1050),但这绝对没问题(作为参考,这台机器可以在该分辨率下以最大设置运行 crysis2 而不会出汗)。
有没有人知道什么可能导致交换链需要这么长时间才能呈现或者我应该在哪里寻找问题?
编辑:
查看我的代码结构,我的 RenderFrame() 函数如下:
preRender();
DeferredRender(preShader);
//Composite scene to output image
CompositeScene(compositeShader);
//Post Process
PostProcess(postProcShader);
//Depth of Field
DoF(dofShader);
//Present the swapchain
postRender();
其中一些函数的结果基于之前的函数(例如,DeferredRender 使用四个渲染目标以逐像素的方式捕获漫反射光照、法线、位置和颜色。然后 CompositeScene 将它们放在一起。这将需要GPU 在继续之前已经计算了上一步。整个过程继续进行,DoF 需要 PostProcess 的结果等。因此,唯一可能保持 Swapchain.Present() 的着色器必须是运行在功能DoF,因为所有其他着色器都会导致CPU锁定直到它们完成。对吗?