Почему запись в RWStructuredBuffer в ComputeShader(hlsl, DirectX11) такая дорогая?

Группы потоков распределены так: Dispatch(1920 / 8, 1080 / 8, 1); Я привязываю UAV(RWStructuredBuffer) к вычислительному шейдеру:

RWTexture2D<float4> Result : register(u0);

[numthreads(8, 8, 1)]
void main(uint3 threadID : SV_DispatchThreadID)
{

}

Да, в данном примере я использую RWTexture2D, но это сути не меняет(изменение fps примерно одинаковое), просто так удобнее показать. Используя такой код, fps = 1500, но как только я добавляю одну строчку:

[numthreads(8, 8, 1)]
void main(uint3 threadID : SV_DispatchThreadID)
{
    Result[threadID.xy] = 1;
}

И в там случае fps снижается до цифры 800, то есть потеря в 700 fps. По моему это как то не нормально, почему так может быть? Подозреваю что проблема в не правильном распределении потков.

Приведу ещё один пример: введите сюда описание изображения

Код вы можете видеть на заднем плане. Я запустил своё приложение, и выводу частоту кадров с помощью Bandicam.

А вот работа другого шейдера(правда пиксельного), который выполняет трассировку лучей:введите сюда описание изображения

Частота кадров лишь чуть чуть больше в первом примере(ComputeShader), при том что код во втором примере(PixelShader) в разы сложнее и дороже, в отличии от простого умножения в Compute shader. А ведь это простое умножения 3 раза, тогда на сколько сильно будет снижатся fps при более сложных операциях. По всей видемости на много, но в чём смысл тогда вообще таких шейдеров, если они на столько не эффективны(уверн что, что то я не так делаю, так блин не должно быть)


Ответы (0 шт):