#optimization #opengl #drawing #rendering #sfml
#оптимизация #opengl #рисование #рендеринг #sfml
Вопрос:
Я делаю базовое моделирование движущихся планет и гравитационного притяжения между ними и отображаю гравитацию с большим полем зеленых векторов, указывающих в направлении, в котором гравитация их притягивает, и величину силы притяжения.
Это означает, что у меня есть более 400 строк, которые на самом деле представляют собой прямоугольники с поворотом, которые перерисовываются каждый кадр, и это снижает мою частоту кадров. Есть ли какой-либо способ оптимизировать это, кроме создания меньшего количества строк? Как современные 2d-игры на OpenGL достигают такой высокой частоты кадров даже при использовании множества сложных полигонов / цветов?
Редактировать:
SFML выполняет фактический рендеринг каждого кадра, но я создаю свои линии, создавая прямоугольник, подобный sf:: Shape. Функция генерации принимает ширину и задает точку 1 как (0, ширина), точку 2 как (0, -ширина), точку 3 как (длина линии, -ширина) и точку 4 (длина линии, ширина). Это формирует прямоугольник, который простирается вдоль положительной оси x. Наконец, я поворачиваю прямоугольник вокруг (0,0), чтобы придать ему правильную ориентацию, и устанавливаю положение фигур там, где должно быть начало строки.
Комментарии:
1. Вам нужно больше рассказать о том, как вы в настоящее время визуализируете свои строки. Кроме того, линии — это не просто «прямоугольники с поворотом».
2. @Nicol Bolas Мои строки =), я добавил объяснение выше.
Ответ №1:
Как современные 2d-игры на OpenGL достигают такой высокой частоты кадров даже при использовании множества сложных полигонов / цветов?
Я представляю себе, не рисуя 400 4-вершинных объектов, каждый из которых поворачивается и масштабируется с помощью матрицы.
Если вы хотите рисовать много таких вещей, вам придется перестать полагаться на классы рисования SFML. Это приводит к большим накладным расходам. Вам нужно будет сделать это правильно: рисуя линии.
Если вы настаиваете на том, чтобы каждая строка имела отдельную ширину, вы не можете использовать GL_LINES . Вместо этого вы должны вычислить четыре позиции «линии» и вставить их в объект buffer. Затем вы рисуете их одним вызовом GL_QUADS. Вам нужно будет использовать надлежащие методы потоковой передачи буферных объектов, чтобы сделать эту работу достаточно быстрой.
Ответ №2:
Большие пакеты и VBO. Также дважды проверьте, сколько времени вы тратите на обновление кода моделирования.
Быстрая проверка: если у вас есть glBegin()
где-то рядом с вашим основным циклом рендеринга, вы, вероятно, делаете это неправильно.
Вычислите все ваши позиции вершин, затем передайте их в GPU через GL_STREAM_DRAW
. Если вы можете терпеть некоторую задержку, используйте два VBO и двойной буфер.