2013-04-10 4 views
13

Каковы самые быстрые и самые гибкие (применимые в большинстве ситуаций) способы использования VBOs?Лучший способ использования VBO

Я разрабатываю приложение openGL, и я хочу, чтобы он достиг максимальной производительности, поэтому мне нужно, чтобы кто-то ответил на эти вопросы. Я прочитал много вопросов и ответов, но я думаю, что есть много информации, которая мне не нужна, что беспорядок мой мозг ...

  • Сколько vbos я должен использовать?
  • Как мне создать vbos?
  • Как обновить данные vbos, если размер данных не фиксирован?
  • Как я должен визуализировать vbos?
  • Как мне обращаться с данными в vbos, которые я больше не хочу отображать?
+2

На многие из ваших вопросов нет действительного ответа. Любые такие ответы будут аппаратно-специфическими. –

ответ

18
  • Сколько vbos следует использовать?

Как можно меньше. Переключение VBO осуществляется с небольшой, но измеримой стоимостью. В общем, вы попытаетесь сгруппировать аналогичные данные в VBOs. Например, в игре FPS все различные виды мусора, лежащие на улице, небольшие реквизиты и т. Д., Обычно будут расположены в одном и том же или только небольшом количестве VBOs.

Это также относится к размерам партии рисунка. glDraw… звонки, которые выносят менее 100 примитивов, являются субоптимальными (это всегда было так, даже 15 лет назад). Таким образом, вы хотите, по возможности, выпустить по меньшей мере 100 примитивов. Но если только одна сетка имеет только, скажем, 20 треугольников (низкопоставленные реквизиты для инстанса или такие), каждый в своем собственном VBO вы больше не можете делать больше.

  • Как создать vbos?

glGenBuffers → glBindBuffer → glBufferData

UPDATE Вы можете передать нулевой указатель параметра glBufferData data для инициализации объекта буфера без установки данных.

  • Как я должен обновить РВО данные, если размер данных не фиксируется?

Создание РВО с крупнозернистого размера зернистости, чем ваш размер данных. Ваша операционная система делает это в любом случае для ваших данных на стороне хоста, это называется пейджинг. Также, если вы хотите использовать glMapBuffer, что делает объект буфера кратным размеру главной страницы очень приятным для всей системы.

Обычный размер страницы для текущих систем - 4kiB. Так что размерность VBO-размера я бы выбрал. ОБНОВЛЕНИЕ: Вы можете обратиться в свою операционную систему, какой размер страницы он использует. Хотя это зависит от ОС, я бы задал еще один вопрос.

Обновление данных с помощью glBufferSubData или отображение его с помощью glMapBuffer в сопоставленной памяти хоста, затем glUnmapBuffer.

Если данные перерастают буферный объект, создайте новый, более крупный и скопируйте с помощью glCopyBufferSubData. См. Параграф lase.

  • Как я должен визуализировать vbos?

glBindBuffer → glDraw ...

  • Как я должен иметь дело с данными в РВО, что я не хочу, чтобы сделать больше?

Если данные занимают только часть VBO и делится ею с другими данными, и вы не бежите из памяти, то, ну просто нет доступа к нему. В идеале вы держите вокруг какой-то индекс, в котором вы отслеживаете, какой VBO имеет, какие части его доступны для какой задачи. Это очень похоже на управление памятью, в частности на схему, известную как стек объектов (obstacks).

Однако в конечном итоге может быть целесообразным уплотнить существующий буферный объект. Для этого вы создадите новый объект буфера, привяжите его как пишущий объект, а старый объект буфера будет выбран как цель чтения. Затем используйте glCopyBufferSubData, чтобы скопировать содержимое в новый, затянутый буферный объект. Конечно, вам придется обновить все ссылки на имя объекта буфера (= OpenGL ID) и смещения.

По этой причине имеет смысл написать тонкий слой абстракции поверх объектов буфера OpenGL, который отслеживает фактические типизированные данные внутри бесструктурных блоков объектов OpenGL-буфера.

+0

Вы уверены, что использование размера 4kiB не приведет к тому, что моя программа будет иметь слишком много vbos? – Qualphey

+0

@visDEVion: Я не говорю, что ваши VBOs должны быть ровно размером 4kiB, но кратным 4kiB (т. Е. Округлять до следующего более высокого кратного 4096). Скажем, вам нужно 10kiB памяти, тогда вы бы выделили VBO размером 14kiB. – datenwolf

+0

ahh ... Посмотрите, я создаю vbos размером 4 МБ для статических и динамических объектов. Если vbo заполнен, я создаю новый с тем же размером, а затем добавлю к нему все новые данные. Что ты об этом думаешь? – Qualphey

-2

Сколько vbo следует использовать?

Столько, сколько нужно, звучит глупо, но хорошо, что путь его

Как я должен обновить РВЫ данные, если размер данных не фиксируется?

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

Как создать vbos?

Как я должен визуализировать vbos?

см VBO tutorial

Как я должен иметь дело с данными в РВО, что я не хочу, чтобы сделать больше?

создать новое vbo и скопировать данные в него или отобразить только части этого vbo, который находится в памяти.

Оказывать только части см glVertexBufferglTexCoordPointer (просто вычислить новый указатель и новый размер, основанный на смещение)

Edit 1:

Использование одного VBO для все чувствует себя не так, потому что у вас есть для управления выделением новых вершинных позиций/текстурных координат, которые действительно становятся очень грязными.

Лучше объединить небольшие реквизиты в VBO и выполнить команды рисования.

Могу ли я добавить данные в буфер с помощью glBufferSubData (добавление 100 элементов в буфер с размером x)?

Нет, это невозможно, потому что в описании указано updates a subset of a buffer object's data store, а подмножество - меньшее множество внутри набора.

Edit 2

Хороший учебник также Learning Modern 3D Graphics Programming но не ВБО специфичны.

+0

Можете ли вы дать мне некоторую информацию о создании vbo? Я думаю об использовании одного vbo для всего. Поскольку я знаю, что вы не можете называть 'glBufferSubData', не вызывая' glBufferData' раньше. Какие данные я должен добавить в vbo, если все данные должны быть добавлены позже? И если в примере размер данных, хранящийся в vbo, равен 100, я могу использовать 'glBufferSubData' для добавления данных с размером 200? – Qualphey

+0

Ох и количество некоторых сменных изменений на каждом кадре. Должен ли я также создать новое vbo, чтобы справиться с этим? – Qualphey

+6

-1: Рекомендация устаревших руководств NeHe. –