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

[Решено] Почему UBO медленнее glProgramUniformMatrix4fv?

Страницы: 1 2 321 22 Следующая »
#0
(Правка: 21:57) 21:56, 7 янв. 2020

Почти 200 вызовов

for (U32 i = 0; i < entity->skeleton->num_of_bones; i++)
{
    glProgramUniformMatrix4fv(Shader::ptr->program, Shader::ptr->umBONESXXX[i], 1, GL_FALSE, value_ptr(tmtrx[i]));
}

работает в 2 раза быстрее, чем один вызов

  glBindBufferBase(GL_UNIFORM_BUFFER, bindingPoint, buf);
  glUniformBlockBinding(shader->program, blockIndex, bindingPoint);
  U08 * ptr = (U08*)glMapBuffer(GL_UNIFORM_BUFFER, GL_WRITE_ONLY);

  memcpy(ptr, &tmtrx[0][0][0], sizeof(mat4)*num_of_bones);

  glUnmapBuffer(GL_UNIFORM_BUFFER);

Почему UBO медленнее многократных glProgramUniformMatrix4fv?

PS: проверено на новой видеокарте nvidia.


#1
22:04, 7 янв. 2020

да ну, кастую любителя загрузки за 1 вызов

#2
22:05, 7 янв. 2020

programina
Ого, с возвращением.

> Почему UBO медленнее многократных glProgramUniformMatrix4fv?
Потому что внутри glProgramUniformMatrix4fv драйвера обычно делают кучу оптимизаций, которых нет в OpenGL API снаружи.
Если твой UBO в данный момент используется (а это скорее всего так, ибо GPU рисует предыдущий кадр), то OpenGL-ю надо выделить кусочек памяти и выдать указатель на него, а только потом залить на GPU.

Пробовала glMapNamedBufferRange с флажком GL_MAP_INVALIDATE_BUFFER_BIT ?

#3
22:11, 7 янв. 2020

MrShoor
> Потому что внутри glProgramUniformMatrix4fv драйвера обычно делают кучу
> оптимизаций

это какие такие ?

#4
22:12, 7 янв. 2020

MrShoor
> внутри glProgramUniformMatrix4fv драйвера обычно делают кучу оптимизаций
Что интересно, на другой карте, которая не вызывает доверия, разницы в производительности практически нет.
MrShoor
> UBO в данный момент используется
Но ведь у UBO есть своя память уже залитая в видеокарту

  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);
#5
22:15, 7 янв. 2020

programina
> Но ведь у UBO есть своя память уже залитая в видеокарту
GPU работает асинхронно. Эту память нельзя менять на ходу, если в данный момент из этой памяти идет отрисовка. Но и ждать в glMapBuffer пока GPU дорисует нельзя, по понятным причинам. Поэтому драйверу нужно выделять эту память локально, и управление вернуть в твой код.

#6
22:20, 7 янв. 2020
Когда 8 Гб видеопамяти, но...

MrShoor
> Эту память нельзя менять на ходу


)))
Почитаю про glMapNamedBufferRange
#7
22:32, 7 янв. 2020

programina
Ничоси, ты там в запое была все это время, с 2016?

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

MrShoor
> Если твой UBO в данный момент используется
MrShoor
> GPU работает асинхронно.
А glFinish с этим всем не должна помочь?

#9
23:05, 7 янв. 2020
glBindBufferBase(GL_UNIFORM_BUFFER, bindingPoint, buf);
glUniformBlockBinding(shader->program, blockIndex, bindingPoint);

U08 * ptr = (U08*)glMapNamedBufferRange(buf, 0, sizeof(mat4)*num_of_bones, GL_MAP_WRITE_BIT|GL_MAP_INVALIDATE_BUFFER_BIT);
memcpy(ptr, &tmtrx[0][0][0], sizeof(mat4)*num_of_bones);

glUnmapBuffer(GL_UNIFORM_BUFFER);

Никакого эффекта. Такой же FPS как во время использования glMapBuffer

#10
23:08, 7 янв. 2020

foxes
> А glFinish с этим всем не должна помочь?
радикально решение

#11
23:13, 7 янв. 2020

foxes
> glFinish
Дополнительно сьедает 20 кадров (450 -> 430)

#12
(Правка: 23:14) 23:14, 7 янв. 2020

programina
> Почему UBO медленнее многократных glProgramUniformMatrix4fv?

Точно не синхронизация между кадрами дает такой эффект? Что если передать GL_MAP_UNSYNCHRONIZED_BIT в glMapNamedBufferRange (для теста, результат будет некорректный)? Что если использовать 2 UBO поочередно?

#13
23:20, 7 янв. 2020

Apfel1994
> Что если использовать 2 UBO поочередно?

тогда уж трипли

#14
(Правка: 23:26) 23:21, 7 янв. 2020

Может быть glProgramUniformMatrix4fv передает данные непосредственно через кольцевой буфер портов ввода вывода, а не шину памяти, от этого разница.
programina
> работает в 2 раза быстрее
Подозрения на лишний memcpy под капотом.
programina
> Почему UBO медленнее многократных glProgramUniformMatrix4fv?
Фактически происходит одно и тоже, должны быть одинаковыми.

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