Griffin
Griffin

Reputation: 2517

how to get faster rendering of 400+ polygons with SFML

I'm making a basic simulation of moving planets and gravitational pull between them, and displaying the gravity with a big field of green vectors pointing in the direction gravity is pulling them and magnitude of the strength of the pull.

This means I have 400 + lines, which are really rectangles with a rotation, being redrawn each frame, and this is killing my frame-rate. Is there anyway to optimize this with other than making less lines? How do 2d OpenGL games today achieve such high frame-rates even with many complex polygons/colors?

EDIT:

SFML does the actual rendering each frame, but the way I create my lines is by making a rectangle-like sf::Shape. The generation function takes a width, and sets point 1 as (0, width), point 2 as (0, -width), point 3 as (LineLength, -width), and point 4 (LineLength, width). This forms a rectangle which extends along the positive x-axis. Finally I rotate the rectangle around (0,0) to get it to the right orientation, and set the shapes position to be wherever the start of the line is supposed to be.

Upvotes: 3

Views: 2627

Answers (2)

Nicol Bolas
Nicol Bolas

Reputation: 473407

How do 2d OpenGL games today achieve such high frame-rates even with many complex polygons/colors?

I imagine by not drawing 400+ 4-vertex objects that are each rotated and scaled with a matrix.

If you want to draw a lot of these things, you're going to have to stop relying on SFML's drawing classes. That introduces a lot of overhead. You're going to have to do it the right way: by drawing lines.

If you insist on each line having a separate width, then you can't use GL_LINES. You must instead compute the four positions of the "line" and stick them in a buffer object. Then, you draw them with a single GL_QUADS call. You will need to use proper buffer object streaming techniques to make this work reasonably fast.

Upvotes: 3

genpfault
genpfault

Reputation: 52083

Large batches and VBOs. Also double-check how much time you're spending in your simulation update code.

Quick check: If you have a glBegin() anywhere near your main render loop you are probably Doing It Wrong.

Calculate all your vertex positions, then stream them into the GPU via GL_STREAM_DRAW. If you can tolerate some latency use two VBOs and double-buffer.

Upvotes: 1

Related Questions