When optimizing a LibGDX game's performance, sometimes you need to look under the hood. Let's add the GLProfiler
to a Screen and see how (in)efficiently we're rendering.
Why?
In OpenGL, binding textures on the GPU can be an expensive operation. For each texture switch, there is a draw call. By minimizing these calls, you can improve rendering performance.
Thankfully, LibGDX has a built-in class to help us inspect the OpenGL calls: GLProfiler
(Docs | Wiki).
Profiler Code
Here's the code needed to set up the GLProfiler in a theoretical "GameScreen" and read the number of draw calls and texture bindings.
import com.badlogic.gdx.graphics.profiling.GLProfiler;
public class GameScreen implements Screen {
// Add this class member
private GLProfiler profiler;
public GameScreen(...) {
// Your setup code
// create & enable the profiler
profiler = new GLProfiler(Gdx.graphics);
profiler.enable();
}
@Override
public void render(float delta) {
// reset on each frame
profiler.reset();
// Do all your rendering here
// ...
// Check the profiler data.
// You can view in debugger, log it, etc...
float drawCalls = profiler.getDrawCalls();
float textureBinds = profiler.getTextureBindings();
// also handy
float fps = Gdx.graphics.getFramesPerSecond();
}
}
What should you look for?
Many factors can result in extra draw calls & texture bindings.
- Maybe you aren't using TextureAtlases?
- Maybe you are, but there are more than needed?
- Maybe you're rendering things in whatever order was convenient 6 years ago while your baby was sleeping?
- Are you using Scene2D, and did not consider the textures when adding Actors to the Stage?
- Scene2D actors (like TextButton) with BitmapFonts that are not packed with the other UI graphics.
- Gremlins
The LibGDX Wiki page on SpriteBatch, TextureRegions, and Sprites is a great resource to learn more.
In general, use fewer texture files, and try to render your objects in texture-order as much as possible.
Case study coming soon
I recently went through a profiling & optimization effort for Santa Skate. Before release, I had not profiled it once! Performance was still okay, but my engineering brain was not satisfied knowing there were still slowdowns. In the coming days (weeks), I plan on writing another post explaining how I tamed the texture binds related to Scene2D widgets and the game world.
Top comments (0)