延迟渲染:性能问题

Deferred Rendering: Performance issues

我刚刚第一次实现延迟 rendering/shading,我很惊讶地发现前向渲染和延迟渲染之间存在巨大的性能差距。

当我 运行 我的应用程序使用前向渲染时,我在 运行 处于发布模式

时获得了相当不错的帧速率

正向渲染

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

延迟渲染

我很清楚,延迟渲染并不是你为了让应用程序运行而添加的东西 "faster"。我认为它是一种性能优化技术,可以通过多种方式进行优化,而且我知道该技术比正向渲染占用的内存更大。

然而...

我目前在场景中有 一个 点光源和一百个使用硬件实例化创建的立方体。光线在 Z 轴上来回移动,将光线投射到立方体上。

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

到目前为止,我已经将 gbuffer 上的纹理格式从 DXGI_FORMAT_R32G32B32A32_FLOAT 更改为 DXGI_FORMAT_R16G16B16A16_FLOAT 只是想看看它是否有任何视觉影响,但没有。

有什么建议吗?谢谢!

旁注
我正在使用 Visual Studio Graphics Diagnostics 调试我的 DirectX 应用程序

解决了!

我启用了 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();

只是为了重置将所有 input/output 资源槽设置为 NULL 的设备上下文,如 MSDN

中所述