Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Стоимость OpenGL команд (комментарии) (5 стр)

Стоимость OpenGL команд (комментарии) (5 стр)

Страницы: 1 2 3 4 5
_Wizard_Участникwww11 мар. 20171:59#60
у меня последний тест выдает
CPU: Intel(R) Core(TM) i5-4460  CPU @ 3.20GHz
GPU: AMD Radeon (TM) R9 380 Series

Parameters: CURRENT_NUM_INSTANCES 1000   NUM_FBO_CHANGES 200   INSTANCING_NUM_ITERATIONS 100. Time in ms.

---States changing time:
SIMPLE_DIPS_TEST                 0.41
FBO_CHANGE_TEST                  1.97
SHADERS_CHANGE_TEST              2.90
VBO_CHANGE_TEST                  0.95
ARRAY_OF_TEXTURES_TEST           3.27
TEXTURES_ARRAY_TEST              0.87
UNIFORMS_SIMPLE_CHANGE_TEST      1.27
UNIFORMS_SSBO_TEST               0.80

---API call cost:
glBindFramebuffer:               9.44   2314% 
glUseProgram:                    2.49   610% 
glBindVertexArray:               0.54   132% 
glBindTexture:                   0.48   116% 
glDrawRangeElements:             0.41   100% 
glUniform4fv:                    0.09   21% 

---Instancing time:
cpu time (gpu time)
num instances                       50            100           200
UBO_INSTANCING                   0.35 (0.10)   0.37 (0.13)   0.36 (0.24)
TBO_INSTANCING                   0.72 (0.11)   0.73 (0.13)   0.73 (0.25)
SSBO_INSTANCING                  0.37 (0.09)   0.40 (0.13)   0.38 (0.24)
VBO_INSTANCING                   0.36 (0.09)   0.37 (0.12)   0.37 (0.24)
TEXTURE_INSTANCING               0.38 (0.10)   0.39 (0.13)   0.39 (0.24)
UNIFORMS_INSTANCING              0.41 (0.13)   0.52 (0.27)   0.74 (0.51)
MULTI_DRAW_INDIRECT_INSTANCING   0.63 (0.53)   1.17 (1.01)   2.10 (1.93)
LaynosПостоялецwww11 мар. 201712:52#61
_Wizard_
> кучу glDrawElementsInstanced за 1 вызов... +можно собирать информацию о дипах
> на ГПУ
Ох! После вашего комента до меня дошло :)

А DIP'ы обычно считают по количеству вызовов gl...Draw... на CPU? Или по факту, сколько было на GPU?
"Batch" - количество биндингов шейдеров и буферов вместе с glMultidrawElementsIndirect?


Ещё я вот заценил код тестов... Наткнулся на

//NOTE: seems data transfering is not bottle neck

Действительно ли всё так?

И в чем смысл от GL_DRAW_INDIRECT_BUFFER, если инфа всё равно каждый раз изменяется на CPU?


Как правильно использовать .instanceCount? Например в батче лежит объект, который должен быть выведен 1000 раз. Неужели всегда придётся создавать отдельные 1000 draw_indirect_commands?

И я так посчитал... Например мы хотим сразу вывести 1'000'000 обжектов. Каждая команда - 20 байт. В итоге каждый кадр надо передавать 20*1'000'000/(1024^2) =  ~19 мб данных. То есть это произойдет почти мгновенно? А если речь о 190 мб? :)

innuendoПостоялецwww11 мар. 201712:55#62
Laynos
> И в чем смысл от GL_DRAW_INDIRECT_BUFFER, если инфа всё равно каждый раз
> изменяется на CPU?

Ты точно понимаешь смысл indirect draw?

LaynosПостоялецwww11 мар. 201712:58#63
innuendo
> Ты точно понимаешь смысл indirect draw?
Перенести gl...Draw... на GPU. Каждый вызов API OpenGL - проверка со стороны драйвера, это замедляет работу движка.
А glMultidraw - один вызов, всё остальное идет на видеокарте. AZDO или что-то там, вроде
innuendoПостоялецwww11 мар. 201713:01#64
Laynos
> Перенести gl...Draw... на GPU.

Почитай доки

_Wizard_Участникwww11 мар. 201713:42#65
Laynos
>Например в батче лежит объект, который должен быть выведен 1000 раз. Неужели всегда придётся создавать отдельные 1000 draw_indirect_commands?
нет... это у меня пример такой просто... читаем доки в общем

дипы на ЦПУ, glDraw*

>И в чем смысл от GL_DRAW_INDIRECT_BUFFER, если инфа всё равно каждый раз изменяется на CPU?
1. так надо) информация должна лежать в этом буфере. Причем оно даже работать будет если напрямую передать, но так не правильно делать - читаем спецификацию
2. можно залить туда данные 1 раз и переиспользовать (несколько кадров/проходов)
3. инфу можно готовить на ГПУ


>//NOTE: seems data transfering is not bottle neck
>Действительно ли всё так?
в данном случае, не более того...
итоговая производительность зависит от кучи всего: количества данных, с какими флагами мапить буфер, в  какой момент ты захочешь эти данные заиспользовать, какая шина у карточки...

>И я так посчитал...
1кк - очень много) но я видел похожие примеры - нормально работало

MAMOHT-92Постоялецwww7 июля 201814:07#66
Ребят, довольно тупой вопрос, вот смена фреймбуфера - это  дорогая операция, а если менять приаттаченную текстуру, а сам FBO оставить тем же, в рамках производительности - это то же самое или нет? Вообще странный вопрос возникает, зачем менять забинденный fbo если можно приаттачить другую текстуру?
ud1Постоялецwww7 июля 201816:42#67
Запускал в убунту под вайном, программа сама не завершилась, закрылась эскейпом, так и должно быть?
CPU:        Intel(R) Core(TM) i7-3770K CPU @ 3.50GHz
GPU: GeForce GTX 650 Ti/PCIe/SSE2

Parameters: CURRENT_NUM_INSTANCES 1000   NUM_FBO_CHANGES 200   INSTANCING_NUM_ITERATIONS 100. Time in ms.

---States changing time:
SIMPLE_DIPS_TEST                 0.18
FBO_CHANGE_TEST                  1.96
SHADERS_CHANGE_TEST              2.32
VBO_CHANGE_TEST                  0.26
ARRAY_OF_TEXTURES_TEST           0.91
TEXTURES_ARRAY_TEST              0.26
UNIFORMS_SIMPLE_CHANGE_TEST      0.74
UNIFORMS_SSBO_TEST               0.24

---API call cost:
glBindFramebuffer:               9.62   5468% 
glUseProgram:                    2.14   1215% 
glBindVertexArray:               0.08   46% 
glBindTexture:                   0.12   69% 
glDrawRangeElements:             0.18   100% 
glUniform4fv:                    0.06   31% 

---Instancing time:
cpu time (gpu time)
num instances                       50            100           200
UBO_INSTANCING                   0.43 (0.10)   0.47 (0.17)   0.54 (0.30)
TBO_INSTANCING                   1.11 (0.59)   1.14 (0.66)   1.20 (0.80)
SSBO_INSTANCING                  0.47 (0.10)   0.50 (0.17)   0.58 (0.31)
VBO_INSTANCING                   0.41 (0.10)   0.44 (0.17)   0.53 (0.30)
TEXTURE_INSTANCING               0.50 (0.10)   0.53 (0.17)   0.61 (0.30)
UNIFORMS_INSTANCING              0.46 (0.10)   0.50 (0.17)   0.66 (0.40)
MULTI_DRAW_INDIRECT_INSTANCING   0.54 (0.46)   0.63 (0.57)   0.85 (0.77)

Vlad2001_MFSПостоялецwww7 июля 201817:23#68
Windows 7 x64, 16 Гб
CPU: AMD FX(tm)-8350 Eight-Core Processor           
GPU: GeForce GTX 760/PCIe/SSE2

Parameters: CURRENT_NUM_INSTANCES 1000   NUM_FBO_CHANGES 200   INSTANCING_NUM_ITERATIONS 100. Time in ms.

---States changing time:
SIMPLE_DIPS_TEST                 0.42
FBO_CHANGE_TEST                  2.18
SHADERS_CHANGE_TEST              2.66
VBO_CHANGE_TEST                  0.43
ARRAY_OF_TEXTURES_TEST           1.75
TEXTURES_ARRAY_TEST              0.36
UNIFORMS_SIMPLE_CHANGE_TEST      0.88
UNIFORMS_SSBO_TEST               0.36

---API call cost:
glBindFramebuffer:               10.48   2470% 
glUseProgram:                    2.24   527% 
glBindVertexArray:               0.00   0% 
glBindTexture:                   0.22   52% 
glDrawRangeElements:             0.42   100% 
glUniform4fv:                    0.05   10% 

---Instancing time:
cpu time (gpu time)
num instances                       50            100           200
UBO_INSTANCING                   0.59 (0.08)   0.73 (0.12)   1.01 (0.22)
TBO_INSTANCING                   1.20 (0.69)   1.34 (0.70)   1.62 (0.80)
SSBO_INSTANCING                  0.62 (0.07)   0.77 (0.12)   1.02 (0.22)
VBO_INSTANCING                   0.57 (0.08)   0.73 (0.13)   0.99 (0.22)
TEXTURE_INSTANCING               0.67 (0.07)   0.79 (0.12)   1.19 (0.22)
UNIFORMS_INSTANCING              0.62 (0.08)   0.81 (0.14)   1.19 (0.57)
MULTI_DRAW_INDIRECT_INSTANCING   0.60 (0.52)   0.72 (0.64)   0.96 (0.86)
barnesПостоялецwww7 июля 201817:34#69
CPU:         Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz
GPU: TITAN X (Pascal)/PCIe/SSE2

Parameters: CURRENT_NUM_INSTANCES 1000   NUM_FBO_CHANGES 200   INSTANCING_NUM_ITERATIONS 100. Time in ms.

---States changing time:
SIMPLE_DIPS_TEST                 0.30
FBO_CHANGE_TEST                  2.01
SHADERS_CHANGE_TEST              2.28
VBO_CHANGE_TEST                  0.38
ARRAY_OF_TEXTURES_TEST           1.16
TEXTURES_ARRAY_TEST              0.36
UNIFORMS_SIMPLE_CHANGE_TEST      0.78
UNIFORMS_SSBO_TEST               0.38

---API call cost:
glBindFramebuffer:               9.77   3279% 
glUseProgram:                    1.98   665% 
glBindVertexArray:               0.09   28% 
glBindTexture:                   0.14   47% 
glDrawRangeElements:             0.30   100% 
glUniform4fv:                    0.05   16% 

---Instancing time:
cpu time (gpu time)
num instances                       50            100           200
UBO_INSTANCING                   0.42 (0.04)   0.43 (0.09)   0.43 (0.17)
TBO_INSTANCING                   3.04 (2.86)   3.03 (2.84)   2.84 (2.65)
SSBO_INSTANCING                  0.48 (0.04)   0.48 (0.09)   0.47 (0.14)
VBO_INSTANCING                   0.41 (0.04)   0.41 (0.09)   0.41 (0.14)
TEXTURE_INSTANCING               0.50 (0.04)   0.49 (0.09)   0.51 (0.14)
UNIFORMS_INSTANCING              0.46 (0.05)   0.48 (0.09)   0.54 (0.14)
MULTI_DRAW_INDIRECT_INSTANCING   0.54 (0.45)   0.61 (0.53)   0.67 (0.60)
/A\Постоялецwww7 июля 201821:47#70
MAMOHT-92
> а если менять приаттаченную текстуру, а сам FBO оставить тем же, в рамках
> производительности - это то же самое или нет?
Думаю это хуже, в вулкане например ты создаешь фреймбуфер сразу со всеми аттачами, чтобы их поменять придется пересоздать фреймбуфер.
v1cПользовательwww7 июля 201822:10#71
Формировать поток рендер-команд на лету и мерять их время - это уже анахронизм.
После Вулкана с его прекомпилированными state objects и запечённых комманд-буферов - выглядит просто ужасно.
MrShoorУчастникwww7 июля 201823:41#72
MAMOHT-92
> а если менять приаттаченную текстуру, а сам FBO оставить тем же, в рамках
> производительности - это то же самое или нет
Будет дороже.

> Вообще странный вопрос возникает, зачем менять забинденный fbo если можно
> приаттачить другую текстуру?
Вообще если там посмотреть, то много вопросов возникает. Зачем вообще делать VAO, если можно каждый раз биндить буфера. Зачем биндить буфера, если можно каждый раз делать glBufferData. Зачем менять program, если можно каждый раз шейдера менять, и т.п.

innuendoПостоялецwww8 июля 20180:23#73
MrShoor
> Зачем менять program, если можно каждый раз шейдера менять

это как?

MrShoorУчастникwww8 июля 20181:17#74
innuendo
> это как?
glDetachShader
glAttachShader
glLinkProgram
Страницы: 1 2 3 4 5

/ Форум / Программирование игр / Графика

2001—2018 © GameDev.ru — Разработка игр