У меня есть система частиц, которую я хочу сделать как можно быстрее, без каких-либо последствий для основной функции отображения. Я в основном поместил все вычисления частиц в отдельный бесконечный поток, который я синхронизирую с WaitForEvent () (Windows), Флаги DataLock и т. Д.
Я использую glColorPointer, glNormalPointer, glVertexPointer и т. Д., Чтобы указать буферизованные данные на графическом процессоре (glGenBuffers, glBufferData), а затем glDrawElements для их рендеринга.
На данный момент у меня нет кода, поэтому я надеюсь, что это не будет проблемой, но я сделаю все возможное, чтобы описать инфраструктуру:
Main [Init]
- Создать очередь предварительного расчета 30% размером N частиц и выполнить последовательные вычисления (Поток 1 # 2)
Тема 1
- Ожидание сигнала «Рассчитать событие» или, если очередь предварительного расчета не заполнена, продолжить
- Перебрать N частиц и обновить положение / скорость, сохраняя их в pUpdate
- Если очередь pre-calc не заполнена, добавьте в нее pUpdate
Main [Render]
- glActiveTexture (TEXTURE0)
- glCol / glNorm / glTex / glVertexPointer
- Если предварительный расчет пуст, используйте самое последнее обновление
- ИЛИ используйте один из предварительных расчетов и удалите
- Сохранение элемента в буфере с помощью glBufferSubData ()
- DrawElements () чтобы нарисовать их
- SwapBuffers
Проблема в том, что функция Render использует около 50 предварительных вычислений в секунду (что ускоряет рендеринг, когда их остается достаточно), прежде чем можно будет даже добавить 1. Вскоре предварительный калькулятор пуст, поэтому все замедляется, и программа возвращается к Main-Render # 3
Есть идеи?