как ускорить рендеринг 400 полигонов с помощью SFML

#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 и двойной буфер.