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

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

Страницы: 1 2 3 4 522 Следующая »
#30
(Правка: 0:18) 0:18, 8 янв. 2020

MrShoor
> Если в glProgramUniformMatrix4fv ты передаешь одинаковые данные, то оно может
> вообще не заливать на видеокарту ничего
Устанавливаю матрицы каждый кадр. (если установить один раз, то UBO, как уже выше писала, работает быстрее. Но что теперь? Не использовать UBO для анимаций:))))


#31
(Правка: 0:21) 0:20, 8 янв. 2020

Вот кусок шейдера (171 - это кол-во костей для скелета DAZ-овской модели):

Для 16 скелетов :)))

struct XXX
{
  mat4 umBONESXXX[171];
};

//layout (std140)
uniform Bones
{
   XXX xxx[16];
};

Для одного скелета:

//layout (std140)
uniform Bones
{
   mat4 umBONESXXX[171];
};

#32
0:22, 8 янв. 2020

programina
> Вот кусок шейдера:
>
> Для 16 скелетов :)))
Не, по одной букве я не готов собирать твой код.

#33
0:27, 8 янв. 2020

MrShoor
> Не, по одной букве я не готов собирать твой код
Попробую сделать сильно облегченную версию проекта. Но это не сегодня.

#34
0:37, 8 янв. 2020

А может быть, что даже не надо ничего больше делать. Ведь если подумать, то мне не нужно каждый кадр обновлять анимацию (особенно когда кадров около 500 штук в секунду)…

Надо посмотреть оба варианта (UBO и glUniform…) под MSI Afterburner при включенной вертикальной синхронизации. Если вариант с UBO потребляет меньше энергии, то это может сказать о том, что имеет смысл использовать UBO.

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

Решено!
Если включить постоянную анимацию всех актёров, то glProgramUniformMatrix4fv сильно теряет в производительности и начинает уступать UBO.
Очевидно, что использование UBO требует контроля, то есть надо отправлять матрицы только тогда, когда происходит анимация для конкретного актёра.

#36
2:45, 8 янв. 2020

programina
> UBO
Надо залить уже всю твою анимацию в один UBO один раз, без последующих обновлений и проблемы бы таковой не было вообще.

#37
3:21, 8 янв. 2020

programina
> Если включить постоянную анимацию всех актёров, то glProgramUniformMatrix4fv
> сильно теряет в производительности и начинает уступать UBO.
А ведь я тебе писал:

Если в glProgramUniformMatrix4fv ты передаешь одинаковые данные, то оно может вообще не заливать на видеокарту ничего.
#38
(Правка: 10:37) 10:36, 8 янв. 2020

MrShoor
> Если в glProgramUniformMatrix4fv ты передаешь одинаковые данные, то оно может
> вообще не заливать на видеокарту ничего
А я давно подозревала о таком ))
foxes
> Надо залить уже всю твою анимацию в один UBO один раз, без последующих
> обновлений и проблемы бы таковой не было вообще.
Можно попробовать для простых моделей: деревья, двери, всякие механические штуковины, для моделей гуманоидов анимации весят много и не поместятся в 65536 байт (у меня анимация на 100 кадров весит около 500000 байт)

#39
10:50, 8 янв. 2020

MrShoor
> начинает уступать UBO.
> А ведь я тебе писал:
>
> Если в glProgramUniformMatrix4fv ты передаешь одинаковые данные, то оно может
> вообще не заливать на видеокарту ничего.
в слитых исходниках Unity сравнивают через memcmp перед отправкой через glUniformXX.
programina
> mat4 umBONESXXX[171]
достаточно матрицы 3х4. Повторюсь, делай большой UBO заливай 1 раз вкадре, рисуй со смещением, на Vulkan я получил 15% прироста, но там и сцена с сотями обьектов и проходами отрисовки. Вообще сделат лучше некий менеджер Constant Buffers выдавать их из пула по запросу, выделять каждый с максимально поддерживаемым размером.

#40
10:59, 8 янв. 2020

Andrey
> в слитых исходниках Unity сравнивают через memcmp перед отправкой через
> glUniformXX

хорошая идея сравнивать float побитово ?

#41
11:12, 8 янв. 2020

Andrey
> делай большой UBO заливай 1 раз вкадре, рисуй со смещением, на Vulkan я получил
> 15% прироста, но там и сцена с сотями обьектов и проходами отрисовки
От заливки нескольких сущностей в один UBO действительно есть эффект. У меня помещается только 5 скелетов в один UBO, возможно поэтому эффект слабый. Надо поэкспериментировать с небольшими объёмами, нечто типа 50 скелетов по 15 костей каждый.

#42
11:40, 8 янв. 2020

programina
> От заливки нескольких сущностей в один UBO действительно есть эффект.

может стоит почитать доки по оптимизациям, а не открывать америку каждый раз ?

#43
12:15, 8 янв. 2020

programina
Там есть множество нюансов.
Во первых, из-за асинхронности GPU и юниформы, и UBO должны где-то храниться до того как попадут на та сторону.
Во вторых, чисто теоретически, юниформы и UBO это немного разные вещи, т.к. первые можно тупо вшить в бинарный шейдер если запарится с оптимизацией. А вторые всегда надо подгружать из памяти т.к. фиг знает что там в буфере.
Из таких допущений следует то, что в зависимости от объема информации, частоты ее обновления и реального обновления данных (когда данные реально меняются, а не передаются те же значения) разные подходы будут работать с разной скоростью в зависимости от обстоятельств (в том числе и производителя видеокарты).

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

Но это все влажные диванные теории. Если реально так нужна скорость то тут только двойное слепое рандомизированное иследование поможет.

#44
(Правка: 12:20) 12:19, 8 янв. 2020

programina
> У меня помещается только 5 скелетов в один UBO
В отдельных случаях вместо UBO можно использовать glVertexAttribDivisor, у которого, строго говоря, нет ограничения на объем.
Но фиг знает насколько это подойдет для скелетов. Я в основном использовал подобное для инстансинга.

Страницы: 1 2 3 4 522 Следующая »
ПрограммированиеФорумГрафика