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

Тормоза из-за glBufferData() (Решено.) (6 стр)

Страницы: 13 4 5 6 7 8 Следующая »
#75
13:08, 31 дек. 2019

Aroch
Я знаю эти ваши энсайты и рендердоки. Я спросил какую кнопку именно в рендердоке нажать....

#76
13:14, 31 дек. 2019

lookid
> Как такую статистику собирать вообще? Какую кнопку нажать?
Меню Window - Statistics.

#77
(Правка: 16:18) 16:17, 31 дек. 2019

Aroch
> Думать он начнет когда нужно будет использовать данные которых нет, но при этом
> уже всё занято и именно этот момент уже начнет создавать нагрузку на шину.
Так я и не говорил что он так не делает, в том же дебаг коллбеке это четко видно:

Buffer object 11 (bound to GL_ARRAY_BUFFER_ARB, usage hint is GL_STATIC_DRAW) will use VIDEO memory as the source for buffer object operations.
Buffer 11, creating time: 66.937184
Buffer object 12 (bound to GL_ARRAY_BUFFER_ARB, usage hint is GL_STATIC_DRAW) will use SYSTEM HEAP memory as the source for buffer object operations.
Buffer 12, creating time: 279.957280

Но! Во-первых - обрати внимание на тайминги, на загрузку 150Мб в видеопамять уходит 67мс (скачет от 55 до 90мс), при загрузке в кучу - время уже 280мс (скачет от 240 до 320мс), эту разницу можно легко заметить. Как у MrShoor получилось 180мс при загрузке в видеопамять и почему при работе с кучей значение не изменилось - вот это уже хз, подозреваю что криво реализована загрузка:
> Если как ты говоришь оно начинает тормозить, то мы после где-то после 25-го
> буфера должны заметить просадки.
У меня как раз просадка очень хорошо заметна.

Теперь по второй части, я уже говорил что драйвер не делает никакой магии и не гоняет данные туда-обратно, это собственно и была основная мысль предыдущего поста, а не то, что оно не может быть в куче. Тест от MrShoor эту тему вообще не раскрывает.

Написал простенький тест - создаю одну сферу на 2М полигонов, забиваю память под завязку (дл 2Гб это 20 аллокаций по 150Мб), но драйвер хитрый, и даже после этого пытается пропихнуть небольшие порции данных в видеопамять, потому я создаю еще 10 таких сфер, и вижу по логу что оно все данные пихает в кучу. Далее, беру последнюю сферу в списке, и сравниваю время между выводом первой сферы, которая целиком в видеопамяти и время на вывод последней сферы, которая целиком в куче. Результаты - GPUTime=6.20ms для сферы в видеопамяти и GPUTime=34.01ms для сферы в куче. Не важно сколько оно времени будет рисоваться, из кучи в видеопамять оно даже не пытается перегнать данные, что я и пытался объяснить.

MemTest
в архиве два теста - MemTest2Gb.exe и MemTest4Gb.exe, соответственно для 2Гб и 4Гб видеокарт, памяти жрет дофига, грузится долго, так что нужно запастись терпением.
Все результаты - в логе консоли.

1 - вывод первой сферы из видеопамяти
2 - вывод последней сферы из кучи
Пробел - печатает текущее время вывода сферы, нужно нажать пару раз, чтоб ресетнуть таймер.

MemTest4Gb - не тестировал, так как столько памяти нет, но по идее должно забить всю доступную (легко проверить по логам, последние 4 записи должны быть "will use SYSTEM HEAP memory")

#78
16:18, 31 дек. 2019

romanshuvalov
> не хранить всё в VBO, вместо этого создать несколько крупных VBO
Да.

Ты опен волд делаешь?

#79
(Правка: 17:32) 17:32, 31 дек. 2019

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

#80
18:24, 31 дек. 2019

Aroch
> Попробуй после того как ты забил видео память, отрисовать сферу из кучи и потом
> рисовать только
Именно так и происходит, там переключение между двумя сферами, какую выберешь - та и будет рисоваться, не важно один кадр или 10 минут, тайминги не меняются.

Я тестировал на NVidia GTX750Ti, можете протестировать на AMD, может там "не индусы" писали драйвера, и оно действительно сработает так, как вы думаете. Но даже в этом случае - если оно не работает на одном из двух вендоров дискретных карт (об Intel и мобильных чипах речь не идет, ибо там другая архитектура), то это уже повод отказаться от такого подхода.

#81
19:04, 31 дек. 2019

romanshuvalov
> Без изменений, точно такие же тормоза, что и без трюка.
Да, драйвер у тебя явно чудит.

> А можешь сделать версию с регулируемым объёмом данных? Т.е. вместо
> фиксированных 500 объектов дай возможность задать их количество (например,
> параметром запуска)
Ок, вечером дома буду, добавлю такой параметр

#82
21:42, 31 дек. 2019

Почему рендердок не может приотачится к некоторым процессам? У одних просто хендшейкает и всё, а у других не может определить битнесс.

#83
13:01, 1 янв. 2020

lookid
> Почему рендердок не может приотачится к некоторым процессам? У одних просто
> хендшейкает и всё, а у других не может определить битнесс.
Там какой то баг, если есть юзать биндлесс текстуры, то он просто падает. Очень не приятный баг который никак не пофиксят.

#84
18:57, 1 янв. 2020

romanshuvalov
Я сделал запуск с параметром как ты просил.
Instancing_v2
Первым параметром передаешь число, это примерный размер общей памяти в мегабайтах.
Т.е. просто

Instancing_v2.exe 500
Означает, что суммарно буферов выделится примерно на 500Мб.
#85
(Правка: 20:44) 20:43, 1 янв. 2020

GTX1050, 2 Гб видеопамяти.

OpenGL:
400 Мб: 4-6 мс, все чисто
800 Мб: 4-6 мс, все чисто
1200 Мб: 4-6 мс, все чисто
1600 Мб: 4-6 мс, все чисто
1700 Мб: 4-6 мс, все чисто
1800 Мб: 4-6 мс, сначала все чисто, при продолжительной работе прыжки до 50 мс
2000 Мб: 5-7 мс, прыжки до 50 мс
При одновременной работе двух экземпляров по 800 Мб: имеем 6-10 мс, прыжков нет.

Итого, как только суммарный объем памяти приближается к двум гигабайтам (к объёму VRAM моей видеокарты), получаем задержку glBufferData до 50 мс. Задержка связана и с фрагментацией, т.к. при 1800 Мб сначала всё чисто и только через некоторое время начинает проявляться задержка.

Проверил также на D3D12:

3000 Мб: 1-3 мс, все чисто
При одновременной работе двух экземпляров по 1600 Мб: 3-5 мс, все чисто
При одновременной работе двух экземпляров по 2200 Мб: 3-7 мс, прыжки до 30-45 мс.
Но результаты иногда странные, иногда в первом экземпляре все чисто, а второй скачет. Трудно уследить за цифрами.

#86
21:12, 1 янв. 2020

romanshuvalov
> GTX1050, 2 Гб видеопамяти.
Интересно, а они не могли опять поставить "медленную" память, как это было с 970?
https://wccftech.com/nvidia-geforce-gtx-970-memory-issue-fully-explained/
Когда они впихнули секцию 3.5Гб быстрой памяти, и секцию 0.5Гб. В результате когда память попадала в 0.5Гб оно просто роняло FPS в играх в 2 раза.

#87
21:41, 1 янв. 2020

MrShoor
> Интересно, а они не могли опять поставить "медленную" память, как это было с 970?
Вряд ли, тем более 1700 Мб же работает чисто (в фоне браузер и сама система тоже что-то занимает).

Кстати, если будешь дорабатывать данную программку еще для чего-нибудь, убери из лога "destroyed", а "size: " выводи только в случае, если количество миллисекунд выше, чем указано во втором параметре. Гораздо удобней будет отслеживать. А указав 0, будет показана каждая строка (при 0 можно и destroyed показывать для полноты картины, если это кому-то нужно).

#88
23:57, 1 янв. 2020

romanshuvalov
> Кстати, если будешь дорабатывать данную программку еще для чего-нибудь
Вряд ли.

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

Fantom09
> Именно так и происходит, там переключение между двумя сферами, какую выберешь -
> та и будет рисоваться, не важно один кадр или 10 минут, тайминги не меняются.
подозреваю что просто идет стримминг небольшими кусками которые сразу отрисовываются поэтому актуальный буфер в итоге не остается так как не влезает полностью в буфер для таких случаев. Попробуй по уменьшать размеры и каждый раз добавляя как видишь скачек тайминга начинать рисовать только эти данные и если тайминги приходят в норму то данные полностью влезли в этот буфер. Если изначальное предположение верно конечно.

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