SFML community forums

Help => Graphics => Topic started by: l0ud on September 27, 2009, 07:10:26 pm

Title: Drawing huge amount of sprites
Post by: l0ud on September 27, 2009, 07:10:26 pm
Hello. I'm trying to find enough efficient way for drawing map in my game. I want to draw 10000 (100x100) small tiles (32x32px for now). Drawing it in every frame with loop is much faster in SFML 2, but it's still to slow. I'm getting only 60fps (without vsync) on modern computer (on my old laptop it's completely unplayable). So, is there any better way to do this? I was thinking about drawing only actually visible elements, but I'm going to implement zooming (sometimes all sprites will be drawn).
It would be nice to draw all sprites in one call like OpenGL lists, but I don't know how to implement this in SFML...
Title: Drawing huge amount of sprites
Post by: Laurent on September 27, 2009, 10:24:00 pm
Quote
Drawing it in every frame with loop is much faster in SFML 2

Wow, I'm so glad to hear this... :lol:

Quote
I was thinking about drawing only actually visible elements, but I'm going to implement zooming (sometimes all sprites will be drawn).

Drawing only the visible tiles is straight-forward, even with zooming. As long as you don't use rotation, the view is just an aligned rectangle, just like your tiles (I assume you have an axis-aligned grid of tiles).

Quote
It would be nice to draw all sprites in one call like OpenGL lists, but I don't know how to implement this in SFML...

This is what SFML 2 does since last week (with the "automatic batching feature"), if all your tiles use the same states (blending mode, color, image).

In this scenario, rendering 100x100 tiles on my 2 year old computer (nVidia 7600 GT, Athlon 3800+), I was able to reach 100 FPS.
Title: Drawing huge amount of sprites
Post by: l0ud on September 28, 2009, 06:48:54 pm
Quote
Drawing only the visible tiles is straight-forward, even with zooming. As long as you don't use rotation, the view is just an aligned rectangle, just like your tiles (I assume you have an axis-aligned grid of tiles).


Yes, but sometimes all the sprites will be drawn. When I zoom out, I'll notice a huge slowdown (especially on old computers). SFML does automatic batching, what gives me large speedup, but I still have to rebuild render queue, making a loop with 10 000 iterations in every frame. I think that it causes slowdowns.
It would be nice to see something, what'll allow me to fill render queue in static (maybe precompiled?) sprites with one call.

I was trying to render all map sprites into OpenGL list and display it by glCallList(). I reached huge speed improvement, but all sprites in list were blinking and disappearing after changing any of sf::View values...
Title: Drawing huge amount of sprites
Post by: K-Bal on September 28, 2009, 07:02:07 pm
You could draw your tilemap on RenderImages with a bigger size if your map is static.
Title: Drawing huge amount of sprites
Post by: Laurent on September 28, 2009, 07:26:35 pm
Quote
You could draw your tilemap on RenderImages with a bigger size if your map is static.

That's an option, but keep in mind that RenderImages are limited in size. You may need to use 4 of them for a 3200x3200 pixels image, on older GPUs.

Quote
It would be nice to see something, what'll allow me to fill render queue in static (maybe precompiled?) sprites with one call.

That could be an improvement for SFML 2 :)
Title: Drawing huge amount of sprites
Post by: l0ud on September 28, 2009, 07:36:08 pm
I know. But the maximum size of sf::Image is too small for the large map. Of course, I can split it into smaller pieces, but that metod still takes huge ammount of memory and isn't easy to implement (some sprites can be larger than grid)...