Небольшие задержки в буферизации данных VBO - PullRequest
3 голосов
/ 26 августа 2011

Я работаю над графическим движком в стиле Minecraft, который скоро будет реализован в реальной игре. У меня есть двигатель до 60+ FPS при стресс-тестировании геометрии. Я использую только LWJGL для поддержки графики. В какой-то момент у меня были большие задержки при обновлении данных VBO в локальной памяти, но я решил эту проблему путем многопоточности, оптимизации и синхронизации универсального блока / конструктора блоков.

Во время, когда я буферизирую данные VBO в видеопамять ПОСЛЕ отбора, я иногда испытываю небольшую заминку (20-30 миллисекунд), которая может вызвать зависание экрана в течение этого времени. Я думаю, что причина задержки заключается в том, что я посылаю огромное количество данных геометрии в VBO (3-5 МБ) через glBufferData (в режиме статического рисования) каждую пару кадров. Я уже реализовал отбраковку усеченного фрагмента, отбраковку усеченного блока, отбраковку воздушного блока и направленный сборщик окружения.

Это оставляет мне два вопроса:

  1. Есть ли другой способ буферизации данных, который я могу использовать, более быстрый, чем glBufferData? (Может быть, способ многопоточности второго буфера в качестве подготовительного, который будет перемещать сцепку во второй поток)?

  2. Если нет, то как бы я реализовал прямой отбор окклюзии из локальной памяти (возможно, из видеопамяти), используя матрицу плавающих точек, указывающих углы кубов (легко манипулируемых)? Обратите внимание, что антипорталы несовместимы с моей структурой.

Или на «простом» английском: как я могу ускорить буферизацию данных в vram с помощью glBufferData без дальнейшего уменьшения размера данных?

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

Обновление 2: по совпадению проблема была решена после того, как я добавил выборку со скрытыми лицами (два соприкасающихся лица = ни один не рендерится). Мне больше не понадобится дополнительное повышение производительности, так как оно само по себе уменьшило размер моего буфера на 90%, а частота кадров увеличилась на 400%. Спасибо за ответы РТС.

1 Ответ

3 голосов
/ 26 августа 2011

Да, есть несколько способов.

  1. Использовать glBufferSubData
  2. Установить использование буфера динамическим или потоковым
  3. Использовать glMapBuffers
  4. Использовать меньшие вершинные примитивы (float вместо double или short вместо int)
  5. Убедитесь, что ваши данные выровнены
  6. Чередуйте ваши VBO, так что вам нужно сделать только одно обновление буфера
  7. Использовать VAO (объект Vertex Array)
  8. Используйте двойную буферизацию, чтобы вы загружали данные в VBO заранее, когда вам нужно сделать рендеринг, чтобы избежать конфликтов ресурсов.
  9. Используйте связанные примитивы, чтобы избежать дублирования вершин (GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN и т. Д.)
...