延迟渲染:性能问题
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
中所述
我刚刚第一次实现延迟 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