Войти
ПрограммированиеФорумГрафика

[Решено] Почему UBO медленнее glProgramUniformMatrix4fv? (4 стр)

Страницы: 13 4 5 622 Следующая »
#45
12:47, 8 янв. 2020

Мои ожидания не подтвердились на надёжной видеокарте от nvidia. При постоянно обновляемой анимации glProgramUniformMatrix4fv на nvidia работает ощутимо быстрее, чем UBO


#46
12:48, 8 янв. 2020

Great V.
> По идее, в общем случае на маленьких объемах юниформы должны всегда рвать UBO.
для этого и делают максимально большой UBO для множества обьектов которым нужен малый обьем памяти для констант, итого эююниформы не нужны вообще.

#47
(Правка: 12:53) 12:51, 8 янв. 2020

Andrey
> итого эююниформы не нужны вообще.

пуш константы тоже ... загрузка за 1 вызов она такая

потом правда в нормальных движках делают гибкую систему аля effects или юниформ, но тебе этого не понять

#48
14:04, 8 янв. 2020

Andrey
> итого эююниформы не нужны вообще
Не согласен. Тут надо исследования проводить где и при каких обстоятельствах скорости выше.
Потому что в теории юниформы это что-то типа #define которые не нуждаются в явной перекомпиляции.
И в таком случае они могут быть намного быстрее UBO из-за отсутствия необходимости чтения из памяти.

#49
(Правка: 14:06) 14:05, 8 янв. 2020

programina
> у меня анимация на 100 кадров весит около 500000 байт
Сегментируй на разные UBO. Используй другие буфферы, текстуры например.

#50
14:23, 8 янв. 2020

Great V.
> И в таком случае они могут быть намного быстрее UBO из-за отсутствия
> необходимости чтения из памяти.
А откуда тогда значения юниформ берутся если не из памяти?

#51
(Правка: 14:37) 14:35, 8 янв. 2020

/A\
Строго говоря нигде нету спецификации как оно должно работать под капотом.
Но в теории если мы говорим о маленьких объемах то вместо хранения всех юниформов в каком-то общем банке памяти, GPU может банально подставлять их значения прямиком в байткод.
Т.е. при изменении юниформы вместо обновления банка памяти компилятор будет просто менять MOV EAX, 5 на MOV EAX, 10 в нужных местах.
Само собой такой подход имеет ограничения и фиг знает как оно там на самом деле. Но он мог бы многое объяснить и быть более эффективным в некоторых случаях.

З.Ы. Я думаю понятно что под "чтением из памяти" я тут понимал чтение из некой "общей памяти" в которой располагаются буферы, а не локальной выполняемой памяти где программа, глобальные переменные, стек и вот это вот все.

#52
14:45, 8 янв. 2020

Great V.
Вообще-то как работает ГПУ найти совсем не сложно...
UBO сохраняется в кэше и из разных тредов читается уже из кэша, что хорошо.
SSBO читается из глобальной памяти, что медленно, но в железе могут быть оптимизации и даже специальный кэш для атомиков.
Память для констант и переменных в шейдере тоже выделяется, на старых мобилках можно было легко упереться в это ограничение.

#53
14:57, 8 янв. 2020

/A\
> Вообще-то как работает ГПУ найти совсем не сложно...
Вообще то если бы везде все одинаково было то не было бы проблем с "портированием" графики под разных вендоров, да и вообще дрова как сущность были бы не нужны.
А то что ты говоришь это лишь "общий подход", который "типа работает всегда".
Но это не отменяет того факта что какие-то дрова могут пихать юниформы напрямую в байткод, ложа болт на все эти "выделения памяти" просто потому что они не нужны.

#54
(Правка: 15:55) 15:43, 8 янв. 2020

programina
> glMapBuffer

Вместо map, заливай все анимации(кости) через glbuffersubdata в один ubo в начале отрисовки кадра. А перед gldrawelements бинди буфер с офсетом (glBindBufferRange).

> U08 * buffer = new U08[blockSize];
> memset(buffer, 0, blockSize);
> glGenBuffers(1, &buf);
> glBindBufferBase(GL_UNIFORM_BUFFER, bindingPoint, buf);
> glBufferData(GL_UNIFORM_BUFFER, blockSize, buffer, GL_STREAM_DRAW);

Это ужас. Вместо выделения памяти через new и обнуления через memset достаточно было просто передать null:

glBufferData(GL_UNIFORM_BUFFER, blockSize, NULL, GL_STREAM_DRAW);

> Загрузила в один UBO 16 скелетов и вот это вот всё работает... )) Тут явно превышен лимит в 65536 байт

Чекни GL_MAX_UNIFORM_BLOCK_SIZE

#55
(Правка: 18:38) 18:33, 8 янв. 2020

Проверила несколько вариантов сочетаний на карте NVIDIA:

Тестовая анимация - 50 моделей выполняющих приседания

+ Показать

181-189

+ Показать

501-506

+ Показать

181-189

+ Показать

495-500

+ Показать

497-501

+ Показать

#56
18:42, 8 янв. 2020

programina

Это на картинке Епифан в памперсах?
#57
18:42, 8 янв. 2020

Вывод: UBO бесполезен для скелетов.

#58
18:48, 8 янв. 2020

programina
1/540 - 1/560
1/59 - 1/60

как думаешь где разница будет больше и во сколько раз? Калькулятором не пользоваться.

#59
18:48, 8 янв. 2020

0xc0de
> через glbuffersubdata
Это помогло. Не знаю почему, но glMapBuffer на NVIDIA медленно работает. Спасибо.

Страницы: 13 4 5 622 Следующая »
ПрограммированиеФорумГрафика