Предварительно вычисленные вершины / матрицы OpenGL для системы частиц / оптимизация - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть система частиц, которую я хочу сделать как можно быстрее, без каких-либо последствий для основной функции отображения. Я в основном поместил все вычисления частиц в отдельный бесконечный поток, который я синхронизирую с WaitForEvent () (Windows), Флаги DataLock и т. Д.

Я использую glColorPointer, glNormalPointer, glVertexPointer и т. Д., Чтобы указать буферизованные данные на графическом процессоре (glGenBuffers, glBufferData), а затем glDrawElements для их рендеринга.

На данный момент у меня нет кода, поэтому я надеюсь, что это не будет проблемой, но я сделаю все возможное, чтобы описать инфраструктуру:

  • Main [Init]

    1. Создать очередь предварительного расчета 30% размером N частиц и выполнить последовательные вычисления (Поток 1 # 2)
  • Тема 1

    1. Ожидание сигнала «Рассчитать событие» или, если очередь предварительного расчета не заполнена, продолжить
    2. Перебрать N частиц и обновить положение / скорость, сохраняя их в pUpdate
    3. Если очередь pre-calc не заполнена, добавьте в нее pUpdate
  • Main [Render]

    1. glActiveTexture (TEXTURE0)
    2. glCol / glNorm / glTex / glVertexPointer
    3. Если предварительный расчет пуст, используйте самое последнее обновление
    4. ИЛИ используйте один из предварительных расчетов и удалите
    5. Сохранение элемента в буфере с помощью glBufferSubData ()
    6. DrawElements () чтобы нарисовать их
    7. SwapBuffers

Проблема в том, что функция Render использует около 50 предварительных вычислений в секунду (что ускоряет рендеринг, когда их остается достаточно), прежде чем можно будет даже добавить 1. Вскоре предварительный калькулятор пуст, поэтому все замедляется, и программа возвращается к Main-Render # 3

Есть идеи?

...