Как стать автором
Обновить

Майнкрафт для геологов: 3D-рендеринг миллиарда ячеек на встроенной видеокарте (часть 2)

Время на прочтение30 мин
Количество просмотров3.3K
Всего голосов 9: ↑9 и ↓0+9
Комментарии13

Комментарии 13

Идея интересная, ухудшается частота кадров достаточно сильно, но видимо она и не является особо важной в данном случае
Для пользователей важна не частота кадров сама по себе, а возможность работать с большими сетками.

Поэтому для оптимизации мы делали замеры на тестовой сетке, которая представляет собой худший из возможных случаев.

Реальные сетки угловой геометрии более-менее состыкованы, и уж точно не имеют 50% случайно-неактивных ячеек, поэтому там падение FPS в худшем случае не такое большое.
В смысле геометрии может быть и не имеют реальные сетки такого характера. Но если на сетку накладывается фильтр (типовая операция) отображения ячеек типа PORO > MEDIAN(PORO), то легко получится как раз 50% случайно заполненная сетка. Поэтому думаю, что такой критерий для тестирования оправдан!
Недавно занимался чем-то похожей задачей. Надо было сделать визуализацию больших пространств для аналитической программы. В итоге пришел к тому, что пространство рассматривается не как одна сетка, а как набор сеток с разным разрешением.

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

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

Сетки угловой геометрии обычно не настолько велики (десятки километров и 500-1000 ячеек по одной из осей). К тому же, нестыкованность и неактивность ячеек осложняет алгоритм уменьшения разрешения сетки — пользователям важно видеть корректную картинку.

Но в целом это хорошая идея — мы могли бы, к примеру, отображать внешний слой ячеек с полной детализацией, а внутренние слои с меньшей детализацией. Но нам для сохранения корректности картинки придется использовать Occlusion Query — предрасчёт будет слишком долгим, как мне кажется.
Да, у меня регулярные сетки. Время разбиения пространства не замерял. У меня на критическом пути оказалась совсем другая задача, а именно подготовка текстур высокого разрешения для земли на ближнем плане. На ее фоне затраты на подготовку сетки оказались незначительными.

Прочитал с интересом,
но ожидал увидеть результаты по встроенной видеокарте, упомянутой в заголовке...

Спасибо!

Замер производительности на встроенной видеокарте не вошел в статью по недосмотру, добавим.

На Intel UHD 630 до оптимизаций на тестовой сетке было 6 и 5 FPS в лучшем и худшем случае, после оптимизаций — 12 FPS в обоих случаях.

Учитывая, что наша тестовая сетка представляет собой худший случай, встроенная видеокарта сможет показать реальную сетку с миллиардом ячеек, хоть и не очень быстро.
Вполне научная статья, было бы здорово в конце статьи увидеть список полезных литературных источников
Подскажите, не было попыток еще уменьшить количество памяти за счет использования геометрического шейдера?
Пробовали, потребление памяти сокращалось на 30%, но при этом FPS падал на 40-50%. Геометрические шейдеры считаются медленными чуть ли не с самого их появления, и на новых поколениях видеокарт улучшений нет. Возможно, новые Mesh-шейдеры окажутся быстрее, но пока видеокарт с их поддержкой очень мало.

К тому же, мы оптимизировали обычную версию так, что потребление памяти сравнялось с версией на геометрических шейдерах, а производительность выросла на 20% (>60% по сравнению с геометрическим шейдером).
А не пробовали положить все данные в один буфер? Вот как здесь 2-й и 3-й варианты:
www.khronos.org/opengl/wiki/Vertex_Specification_Best_Practices#Formatting_VBO_Data
Мне 3-й метод кажется более предпочтительным, т.к. он в целом более популярен (используется в DirectX), и видеокарты должны быть лучше заточены под такое расположение данных. Хотя это только предположение, не проверял.

Также отмечу, что если изначально у вас объёмные данные, которые можно представить 3D-массивом, то их можно визуализировать вообще без использования вершин и полигонов, через volume raycasting.
habr.com/ru/post/123632
На старых видеокартах были проблемы с ограниченным размером буфера — 2 Гб (даже на 64-битной ОС). Поэтому пока держим отдельные буферы.

Вообще, будет довольно интересно замерить разницу производительности между всеми тремя вариантами — отдельные буферы, AoS и SoA, спасибо за комментарий!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий