Эффективное распределение VBO в WebGL - PullRequest
6 голосов
/ 14 сентября 2011

Я пишу приложение WebGL, которое алгоритмически генерирует геометрию. Геометрия будет состоять из 4-150 объектов, каждый из которых содержит от 16 до 2048 точек, нарисованных как TRIANGLE_STRIP через drawElements. Геометрия будет большей частью статичных кадров, но должна быть анимирована в ответ на пользовательский ввод. В этих кадрах при обновлении геометрии точки / трис могут быть добавлены или удалены. Объекты также должны быть добавлены / удалены в течение всей жизни программы.

Каков наиболее эффективный способ размещения / обновления VBO в этом контексте? Я почти уверен, что должен использовать DYNAMIC_DRAW и bufferSubData для обновления каждого объекта, но хочу ли я перераспределить несколько огромных VBO (в худшем случае с точки зрения точек на объект) и определить каждый объект как смещение (номер объекта * максимальный размер на объект), а затем иметь много выделенной неиспользуемой памяти VBO в лучшем случае? Или я должен попробовать другой подход? Или это достаточно мало с точки зрения объема памяти, о котором я думаю?

1 Ответ

8 голосов
/ 14 сентября 2011

Каков наиболее эффективный способ выделения / обновления VBO в этом контексте?Я почти уверен, что должен использовать DYNAMIC_DRAW и bufferSubData для обновления каждого объекта.

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

Или это слишком мало с точки зрения объема памяти, о котором я слишком много думаю?

Вы оценили наихудший случай памяти, с которым вы сталкиваетесь?Учитывая ваши числа, я уверен, что он будет ниже 16 МБ (150 объектов * 2048 точек * 3 поплавка двойной точности на точку * 8 байт на удвоение = 7,4 МБ, только 3,7 МБ, если используются поплавки одинарной точности).Сравните это с несколькими сотнями мегабайт оперативной памяти, которые предлагают современные видеокарты (у моей GeForce 8800GTX 2006 года 768 Мб оперативной памяти, а у Radeon HD6570 - 1024 Мб (= 1 Гб).

...