DEV Community

Mike
Mike

Posted on • Originally published at skaterdad.dev

How To Use The LibGDX GLProfiler

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)