延迟渲染:性能问题

时间:2015-07-29 13:49:41

标签: c++ visual-studio-debugging directx-11 deferred-rendering

我第一次实施了延迟渲染/着色,我惊讶地发现前向渲染和延迟渲染之间存在很大的性能差距。

当我使用正向渲染运行我的应用程序时,在释放模式下运行时,我获得了相当不错的帧速率

FORWARD RENDERING enter image description here

然而,当我使用延迟渲染运行它时,它给了我一个相当令人惊讶的输出

DEENDRED RENDERING enter image description here

我很清楚,延迟渲染不是你为应用程序设置的东西,而是更快"。我认为它是一种性能优化技术,可以通过多种方式进行优化,我知道该技术比前向渲染具有更大的内存占用。

...然而

我目前在场景中获得了 ONE 点光源,并且通过硬件实例创建了100个立方体。光线在Z轴上来回移动,在立方体上投射光线。

问题是移动时灯光非常迟钝。它太迟了以至于应用程序没有注册键盘输入。老实说,我没有为此做好准备,我认为我在实施过程中做了一些可怕的事情。

到目前为止,我已将gbuffers的纹理格式从DXGI_FORMAT_R32G32B32A32_FLOAT更改为DXGI_FORMAT_R16G16B16A16_FLOAT jsut以查看它是否有任何视觉效果,但事实并非如此。

有什么建议吗?谢谢!

SIDE NOTE
我使用Visual Studio Graphics Diagnostics来调试我的DirectX应用程序

1 个答案:

答案 0 :(得分:1)

解决了!

我启用了DirectX debug layer,我收到了大量的D3D11警告

D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets: Resource being set to OM RenderTarget slot 1 is still bound on input! [ STATE_SETTING WARNING #9: DEVICE_OMSETRENDERTARGETS_HAZARD]
D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets[AndUnorderedAccessViews]: Forcing PS shader resource slot 1 to NULL. [ STATE_SETTING WARNING #7: DEVICE_PSSETSHADERRESOURCES_HAZARD]
D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets: Resource being set to OM RenderTarget slot 2 is still bound on input! [ STATE_SETTING WARNING #9: DEVICE_OMSETRENDERTARGETS_HAZARD]
D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets[AndUnorderedAccessViews]: Forcing PS shader resource slot 2 to NULL. [ STATE_SETTING WARNING #7: DEVICE_PSSETSHADERRESOURCES_HAZARD]
D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets: Resource being set to OM RenderTarget slot 3 is still bound on input! [ STATE_SETTING WARNING #9: DEVICE_OMSETRENDERTARGETS_HAZARD]
D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets[AndUnorderedAccessViews]: Forcing PS shader resource slot 3 to NULL. [ STATE_SETTING WARNING #7: DEVICE_PSSETSHADERRESOURCES_HAZARD]

所以在渲染函数结束时,即在

之后
mSwapChain->Present( 0, 0 );

我添加了

mDeviceContext->ClearState();

按照MSDN

中的说明,重置设备上下文,将所有输入/输出资源槽设置为NULL