как ускорить рендеринг 400+ полигонов с помощью SFML - PullRequest
3 голосов
/ 26 октября 2011

Я делаю базовое моделирование движущихся планет и гравитационного притяжения между ними, и отображаю гравитацию с большим полем зеленых векторов, указывающих в направлении, в котором гравитация притягивает их, и величиной силы притяжения.

Это означает, что у меня 400+ линий, которые на самом деле представляют собой прямоугольники с вращением, перерисовываются каждый кадр, и это убивает мою частоту кадров. Есть ли способ оптимизировать это, кроме как делать меньше строк? Как современные игры OpenGL достигают такой высокой частоты кадров даже при наличии множества сложных полигонов / цветов?

РЕДАКТИРОВАТЬ:

SFML выполняет фактическую визуализацию каждого кадра, но я создаю свои линии, создавая прямоугольник sf :: Shape. Функция генерации принимает ширину и устанавливает точку 1 как (0, ширина), точку 2 как (0, -width), точку 3 как (LineLength, -width) и точку 4 (LineLength, ширина). Это формирует прямоугольник, который простирается вдоль положительной оси X. Наконец, я поворачиваю прямоугольник вокруг (0,0), чтобы получить его правильную ориентацию, и устанавливаю положение фигур так, чтобы оно было там, где должно быть начало линии.

Ответы [ 2 ]

3 голосов
/ 29 октября 2011

Как в 2d играх OpenGL сегодня достигается такая высокая частота кадров даже при наличии множества сложных полигонов / цветов?

Я представляю, что не рисую 400+ 4-вершинных объектов, каждый из которых вращаетсяи масштабируется с помощью матрицы.

Если вы хотите рисовать многие из этих вещей, вам придется перестать полагаться на классы рисования SFML.Это вносит много накладных расходов.Вам придется делать это правильно: рисуя линии.

Если вы настаиваете на том, чтобы каждая линия имела отдельную ширину, вы не можете использовать GL_LINES.Вместо этого вы должны вычислить четыре позиции «линии» и вставить их в буферный объект.Затем вы рисуете их одним вызовом GL_QUADS.Вам нужно будет использовать надлежащие методы потоковой передачи буферных объектов , чтобы сделать эту работу достаточно быстрой.

1 голос
/ 26 октября 2011

Большие партии и VBOs . Также дважды проверьте, сколько времени вы тратите в коде обновления симуляции.

Быстрая проверка: если у вас есть glBegin() где-нибудь рядом с основным циклом рендеринга, вы, вероятно, делаете это неправильно.

Рассчитайте все ваши позиции вершин, затем направьте их в GPU через GL_STREAM_DRAW. Если вы можете допустить некоторую задержку, используйте два VBO и двойной буфер.

...