Отложенный рендеринг: проблемы с производительностью

Я только что реализовал отложенный рендеринг / шейдинг в первый раз, и я был удивлен, увидев большой разрыв в производительности между прямым и отложенным рендерингом.

Когда я запускаю свое приложение с прямым рендерингом, я получаю довольно приличную частоту кадров при работе в режиме Release

ВПЕРЕД РЕНДЕРИНГ
введите описание изображения здесь

Однако когда я запустил его с отложенным рендерингом, это дало мне довольно неожиданный результат

Отложенный рендеринг
введите описание изображения здесь

Я хорошо знаю, что отложенный рендеринг — это НЕ то, чем вы покрываете приложение, чтобы оно работало «быстрее». Я считаю, что это метод оптимизации производительности, который можно оптимизировать множеством способов, и я понимаю, что этот метод имеет больший объем памяти, чем прямой рендеринг.

Тем не мение…

У меня сейчас есть ОДИН точечный свет в сцене и сто кубов, созданных с помощью аппаратного копирования. Свет движется взад и вперед по оси Z, бросая свет на кубики.

Проблема в том, что свет очень медленный при движении. Это так медленно, что приложение не регистрирует ввод с клавиатуры. Честно говоря, я не был готов к этому, и я предполагаю, что я делаю что-то ужасное в своей реализации.

Пока что я изменил формат текстур на gbuffers с DXGI_FORMAT_R32G32B32A32_FLOAT в DXGI_FORMAT_R16G16B16A16_FLOAT Чтобы увидеть, оказал ли он какое-либо визуальное воздействие, но это не так.

Какие-либо предложения? Спасибо!

ПРИМЕЧАНИЕ
Я использую Visual Studio Графика Диагностика для отладки моих приложений DirectX

0

Решение

Решил это!

Я включил DirectX отладочный слой и я получил море предупреждений 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();

Просто для сброса контекста устройства, который устанавливает все слоты ввода / вывода ресурсов в NULL как объяснено на MSDN

1

Другие решения


По вопросам рекламы [email protected]