Почему запись в 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 при более сложных операциях. По всей видемости на много, но в чём смысл тогда вообще таких шейдеров, если они на столько не эффективны(уверн что, что то я не так делаю, так блин не должно быть)
