Skater Dad Software aka. Mike

How To Use The LibGDX GLProfiler

Mike Montoya

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.


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.


public class GameScreen implements Screen {
// Add this class member
private GLProfiler profiler;

public GameScreen(...) {
// Your setup code

// create & enable the profiler
profiler = new GLProfiler(;

public void render(float delta) {
// reset on each frame

// 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 =;


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.

Check out my other blog posts and games!

Want the latest updates?  Follow me on Twitter!