CINXE.COM

Profiling - libGDX

<!doctype html> <!-- Minimal Mistakes Jekyll Theme 4.26.2 by Michael Rose Copyright 2013-2024 Michael Rose - mademistakes.com | @mmistakes Free for personal and commercial use under the MIT license https://github.com/mmistakes/minimal-mistakes/blob/master/LICENSE --> <html lang="en" class="no-js"> <head> <meta charset="utf-8"> <!-- begin _includes/seo.html --><title>Profiling - libGDX</title> <meta name="description" content="This article describes the little helpers and utilities that might come in handy in case you are running into performance problems and need to start profiling your game. FPSLogger The..."> <meta property="og:type" content="website"> <meta property="og:locale" content="en_US"> <meta property="og:site_name" content="libGDX"> <meta property="og:title" content="Profiling"> <meta property="og:url" content="https://libgdx.com/wiki/graphics/profiling"> <meta property="og:description" content="This article describes the little helpers and utilities that might come in handy in case you are running into performance problems and need to start profiling your game. FPSLogger The..."> <meta property="og:image" content="https://libgdx.com/assets/images/logo.png"> <link rel="canonical" href="https://libgdx.com/wiki/graphics/profiling"> <meta name="google-site-verification" content="qc0iys9Aweas1z8EhICO-0Ohwh6Iq1GDV6K75e0ToO8" /> <!-- end _includes/seo.html --> <link href="/feed.xml" type="application/atom+xml" rel="alternate" title="libGDX Feed"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script type="text/javascript"> document.documentElement.className = document.documentElement.className.replace(/\bno-js\b/g, '') + ' js '; window.enable_copy_code_button = true; </script> <link rel="stylesheet" href="/assets/css/main.css"> <meta name="color-scheme" content="light dark"> <style> @import url("/assets/css/main2.css") (prefers-color-scheme: dark); </style> <link rel="preload" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@latest/css/all.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'"> <noscript><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@latest/css/all.min.css"></noscript> <link rel="apple-touch-icon" sizes="180x180" href="/assets/icons/apple-touch-icon.png"> <link rel="icon" type="image/png" sizes="32x32" href="/assets/icons/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="16x16" href="/assets/icons/favicon-16x16.png"> <link rel="manifest" href="/assets/icons/site.webmanifest"> <link rel="mask-icon" href="/assets/icons/safari-pinned-tab.svg" color="#5bbad5"> <link rel="shortcut icon" href="/assets/icons/favicon.ico"> <meta name="msapplication-TileColor" content="#da532c"> <meta name="msapplication-config" content="/assets/icons/browserconfig.xml"> <meta name="theme-color" content="#ffffff"> <link rel="stylesheet" href="/assets/css/wiki.css"> </head> <body class="layout--wiki" dir="ltr"> <nav class="skip-links"> <ul> <li><a href="#site-nav" class="screen-reader-shortcut">Skip to primary navigation</a></li> <li><a href="#main" class="screen-reader-shortcut">Skip to content</a></li> <li><a href="#footer" class="screen-reader-shortcut">Skip to footer</a></li> </ul> </nav> <div class="masthead"> <div class="masthead__inner-wrap"> <div class="masthead__menu"> <nav id="site-nav" class="greedy-nav"> <a class="site-logo" href="/wiki/"> <picture> <source srcset="/assets/brand/logo_dark.svg" media="(prefers-color-scheme: dark)"> <img src="/assets/brand/logo.svg" alt=" "> </picture> </a> <a class="site-title" href="/"> </a> <ul class="visible-links"><li class="masthead__menu-item"> <a href="/" >Back to Main Site</a> </li><li class="masthead__menu-item"> <a href="/wiki/" >Wiki Home</a> </li></ul> <a href="/wiki/search"> <svg class="icon" width="16" height="16" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.99 16"> <path d="M15.5,13.12L13.19,10.8a1.69,1.69,0,0,0-1.28-.55l-0.06-.06A6.5,6.5,0,0,0,5.77,0,6.5,6.5,0,0,0,2.46,11.59a6.47,6.47,0,0,0,7.74.26l0.05,0.05a1.65,1.65,0,0,0,.5,1.24l2.38,2.38A1.68,1.68,0,0,0,15.5,13.12ZM6.4,2A4.41,4.41,0,1,1,2,6.4,4.43,4.43,0,0,1,6.4,2Z" transform="translate(-.01)"></path> </svg> </a> <button class="greedy-nav__toggle hidden" type="button"> <span class="visually-hidden">Toggle menu</span> <div class="navicon"></div> </button> <ul class="hidden-links hidden"></ul> </nav> </div> </div> </div> <div class="initial-content"> <div id="main" role="main"> <header> <h1 id="page-title" class="page__title" itemprop="headline">Profiling </h1> <div class="header-meta"> <a href="https://github.com/libgdx/libgdx.github.io/commits/dev/wiki/graphics/profiling.md">View revision history</a> • <a href="https://github.com/libgdx/libgdx.github.io/edit/dev/wiki/graphics/profiling.md">Edit on GitHub</a> </div> </header> <article class="page h-entry" itemscope itemtype="https://schema.org/CreativeWork"> <div class="page__inner-wrap"> <section class="page__content e-content markdown-body" itemprop="text"> <p>This article describes the little helpers and utilities that might come in handy in case you are running into performance problems and need to start profiling your game.</p> <h1 id="fpslogger">FPSLogger</h1> <p>The <a href="https://javadoc.io/doc/com.badlogicgames.gdx/gdx/latest/com/badlogic/gdx/graphics/FPSLogger.html"><code class="language-plaintext highlighter-rouge">FPSLogger</code></a> is a simple helper class to log the frames per seconds achieved. Just invoke the <code class="language-plaintext highlighter-rouge">log()</code> method in your rendering method. The output will be logged once per second.</p> <h1 id="performancecounter">PerformanceCounter</h1> <p>The <a href="https://javadoc.io/doc/com.badlogicgames.gdx/gdx/latest/com/badlogic/gdx/utils/PerformanceCounter.html"><code class="language-plaintext highlighter-rouge">PerformanceCounter</code></a> keeps track of the time and load (percentage of total time) a specific task takes. Call <code class="language-plaintext highlighter-rouge">start()</code> just before starting the task and <code class="language-plaintext highlighter-rouge">stop()</code> right after. You can do this multiple times if required. Every render or update call <code class="language-plaintext highlighter-rouge">tick()</code> to update the values. The <code class="language-plaintext highlighter-rouge">time</code> FloatCounter provides access to the minimum, maximum, average, total and current time the task takes. Likewise for the <code class="language-plaintext highlighter-rouge">load</code> value, which is the percentage of the total time.</p> <h1 id="opengl">OpenGL</h1> <h2 id="profiling">Profiling</h2> <p>Profiling the actual OpenGL calls that happen while your game is running is often not very easy to do, since libGDX tries to abstract all those low-level things away. In order to enable the collection of this information, there is the <a href="https://javadoc.io/doc/com.badlogicgames.gdx/gdx/latest/com/badlogic/gdx/graphics/profiling/GLProfiler.html"><code class="language-plaintext highlighter-rouge">GLProfiler</code></a>.</p> <p>To enable it you need to instantiate a new GLProfiler object, then call the method <code class="language-plaintext highlighter-rouge">glProfiler.enable()</code>. Behind the scenes this will replace the original <code class="language-plaintext highlighter-rouge">GL20</code> and <code class="language-plaintext highlighter-rouge">GL30</code> instances (<code class="language-plaintext highlighter-rouge">Gdx.gl</code> etc.) with the profilers.</p> <p>Now those will be active and start to monitor the actual GL calls (and GL errors, see below) for you. One information you might be interested in, could be the amount of texture bindings that happen, which are costly and might slow down your game. To optimize this, you might start to use a <code class="language-plaintext highlighter-rouge">TextureAtlas</code>. To prove with actual numbers that the texture bindings become less, you can call <code class="language-plaintext highlighter-rouge">glProfiler.getTextureBindings()</code>.</p> <p>You might also implement something like view frustum culling to render only those things that are visible on the screen. The method <code class="language-plaintext highlighter-rouge">glProfiler.getDrawCalls()</code> will return the total number of draw calls made.</p> <p>The following information is provided by the profiler:</p> <ul> <li>Amount of total OpenGL calls</li> <li>Amount of draw calls</li> <li>Amount of texture bindings</li> <li>Amount of shader switches</li> <li>Amount of used vertices</li> </ul> <p><code class="language-plaintext highlighter-rouge">glProfiler.getVertexCount()</code> returns a <a href="https://javadoc.io/doc/com.badlogicgames.gdx/gdx/latest/com/badlogic/gdx/math/FloatCounter.html"><code class="language-plaintext highlighter-rouge">FloatCounter</code></a>. From the FloatCounter you can access fields which provide more information (count, total, min, max, average, latest, and value).</p> <p>In order to reset all these numbers once you have read and displayed them (probably once per frame), you have to call the <code class="language-plaintext highlighter-rouge">glProfiler.reset()</code> method. To completely disable the profiling and replace the profilers with the original <code class="language-plaintext highlighter-rouge">GL20</code> and <code class="language-plaintext highlighter-rouge">GL30</code> instances, use <code class="language-plaintext highlighter-rouge">glProfiler.disable()</code>.</p> <p><em>Note that in case you are using <code class="language-plaintext highlighter-rouge">Gdx.graphics.getGL20()</code> or <code class="language-plaintext highlighter-rouge">Gdx.graphics.getGL30()</code> you are bypassing the profiler and that’s why you should use <code class="language-plaintext highlighter-rouge">Gdx.gl20</code> or <code class="language-plaintext highlighter-rouge">Gdx.gl30</code> directly.</em></p> <p>To see how to use this you can have a look at the <a href="https://github.com/libgdx/libgdx/blob/master/tests/gdx-tests/src/com/badlogic/gdx/tests/g3d/Benchmark3DTest.java">Benchmark3DTest</a></p> <h2 id="error-checking-since-165">Error checking <em>(since 1.6.5)</em></h2> <p><code class="language-plaintext highlighter-rouge">GLProfiler</code> has one more useful feature and that is error checking.</p> <p>Almost all GL calls can in some circumstances produce errors. These errors are not thrown or logged like Java errors, but they have to be explicitly checked for (<code class="language-plaintext highlighter-rouge">Gdx.gl.getError()</code>), so they can be hard to find. Enabling <code class="language-plaintext highlighter-rouge">GLProfiler</code> (see above on how to enable) will automatically check for GL errors after every GL call and report it, so you don’t have to.</p> <p>By default, encountered errors will be printed to the console (using <code class="language-plaintext highlighter-rouge">Gdx.app.error</code>). However, this can be customized (for example for your own logging/crash reporting system) by setting up a different error listener with <a href="https://javadoc.io/doc/com.badlogicgames.gdx/gdx/latest/com/badlogic/gdx/graphics/profiling/GLProfiler.html#setListener-com.badlogic.gdx.graphics.profiling.GLErrorListener-"><code class="language-plaintext highlighter-rouge">glProfiler.setListener()</code></a>.</p> <p>If you want to know where exactly the error happened in your code, you may want to use the <a href="https://javadoc.io/doc/com.badlogicgames.gdx/gdx/latest/com/badlogic/gdx/graphics/profiling/GLErrorListener.html#THROWING_LISTENER"><code class="language-plaintext highlighter-rouge">GLErrorListener.THROWING_LISTENER</code></a> which throws an exception on any GL error. Error listener callback is called inside GL call, so the stack trace will reveal where exactly things went wrong. <em>(Throwing an exception on GL error will most likely crash your application in case of errors, so it is not used by default.)</em></p> <p>For example use and testing, there is a <a href="https://github.com/libgdx/libgdx/blob/master/tests/gdx-tests/src/com/badlogic/gdx/tests/GLProfilerErrorTest.java">GLProfilerErrorTest</a></p> <h1 id="apitrace">apitrace</h1> <p><a href="https://github.com/apitrace/apitrace">apitrace</a> is an open source cross platform debugger and profiler for OpenGL. You run the tracer to record the state and each call (including contents of buffers). You then run the viewing tool will read the trace and playback any state at any point in time. It breaks down the cpu/gpu time, every single OpenGL call. You can see the contents of the framebuffer and each texture bound at any point you choose.</p> <p>Running: For linux, do: <code class="language-plaintext highlighter-rouge">apitrace trace java -cp /home/me/my-app/desktop/build/libs/*.jar -Dorg.lwjgl.opengl.libname=/usr/lib/apitrace/wrappers/glxtrace.so com.my.app.desktop.DesktopLauncher</code></p> <p>Then just exit your app (if you want), run <code class="language-plaintext highlighter-rouge">qapitrace</code> and open that trace file.</p> <aside class="sidebar__right"> <div class="toc"> <div class="wiki_toc__menu"> <input id="wiki_ac-toc" name="accordion-toc" type="checkbox" /> <label for="wiki_ac-toc">Toggle Menu</label> <div class="wiki_nav__items"> <h1 id="table-of-contents">Table of Contents</h1> <h2 id="getting-started">Getting Started</h2> <ul> <li><a href="/wiki/start/setup">Setting Up a Dev Environment</a></li> <li><a href="/wiki/start/project-generation">Creating Your First libGDX Project</a></li> <li><a href="/wiki/start/import-and-running">Importing &amp; Running It</a></li> <li><a href="/wiki/start/a-simple-game">A Simple Game</a></li> <li><a href="/wiki/start/simple-game-extended">Extending the Simple Game</a></li> <li><a href="/wiki/start/demos-and-tutorials">Demos &amp; Tutorials</a></li> </ul> <h2 id="developers-guide">Developer’s Guide</h2> <details><summary>The Application Framework</summary> <div> <ul> <li><a href="/wiki/app/the-application-framework">The Application Framework</a></li> <li><a href="/wiki/app/the-life-cycle">The life-cycle</a></li> <li><a href="/wiki/app/modules-overview">Modules overview</a></li> <li><a href="/wiki/app/starter-classes-and-configuration">Starter classes and configuration</a></li> <li><a href="/wiki/app/querying">Querying</a></li> <li><a href="/wiki/app/logging">Logging</a></li> <li><a href="/wiki/app/threading">Threading</a></li> <li><a href="/wiki/app/interfacing-with-platform-specific-code">Interfacing with platform specific code</a></li> </ul> </div> </details> <details><summary>Audio</summary> <div> <ul> <li><a href="/wiki/audio/audio">Audio</a></li> <li><a href="/wiki/audio/playing-pcm-audio">Playing PCM audio</a></li> <li><a href="/wiki/audio/recording-pcm-audio">Recording PCM audio</a></li> <li><a href="/wiki/audio/sound-effects">Sound effects</a></li> <li><a href="/wiki/audio/streaming-music">Streaming music</a></li> </ul> </div> </details> <details><summary>Deployment</summary> <div> <ul> <li><a href="/wiki/deployment/deploying-your-application">Deploying Your Application</a></li> <li><a href="/wiki/deployment/bundling-a-jre">Bundling a JRE</a></li> </ul> </div> </details> <details><summary>Extensions</summary> <div> <ul> <li><a href="/wiki/extensions/physics/physics">Physics</a> <ul> <li><a href="/wiki/extensions/physics/bullet/bullet-physics">Bullet Physics</a> <ul> <li><a href="/wiki/extensions/physics/bullet/bullet-wrapper-contact-callbacks">Bullet Wrapper Contact callbacks</a></li> <li><a href="/wiki/extensions/physics/bullet/bullet-wrapper-custom-classes">Bullet Wrapper Custom classes</a></li> <li><a href="/wiki/extensions/physics/bullet/bullet-wrapper-debugging">Bullet Wrapper Debugging</a></li> <li><a href="/wiki/extensions/physics/bullet/bullet-wrapper-setup">Bullet Wrapper Setup</a></li> <li><a href="/wiki/extensions/physics/bullet/bullet-wrapper-using-models">Bullet Wrapper Using models</a></li> <li><a href="/wiki/extensions/physics/bullet/bullet-wrapper-using-the-wrapper">Bullet Wrapper Using the wrapper</a></li> </ul> </li> <li><a href="/wiki/extensions/physics/box2d">Box2d</a></li> </ul> </li> <li><a href="/wiki/extensions/artificial-intelligence">Artificial Intelligence</a></li> <li><a href="/wiki/extensions/gdx-freetype">Gdx freetype</a></li> <li><a href="/wiki/extensions/gdx-pay">gdx pay</a></li> </ul> </div> </details> <p><a href="/wiki/file-handling">File handling</a></p> <details><summary>Graphics</summary> <div> <ul> <li><a href="/wiki/graphics/graphics">Graphics</a></li> <li>2D Graphics <ul> <li>Bitmap Fonts <ul> <li><a href="/wiki/graphics/2d/fonts/bitmap-fonts">Bitmap fonts</a></li> <li><a href="/wiki/graphics/2d/fonts/color-markup-language">Color Markup Language</a></li> <li><a href="/wiki/graphics/2d/fonts/distance-field-fonts">Distance field fonts</a></li> </ul> </li> <li>Scene2d <ul> <li><a href="/wiki/graphics/2d/scene2d/scene2d-ui">Scene2d.ui</a></li> <li><a href="/wiki/graphics/2d/scene2d/scene2d">Scene2d</a></li> <li><a href="/wiki/graphics/2d/scene2d/skin">Skin</a></li> <li><a href="/wiki/graphics/2d/scene2d/table">Table</a></li> </ul> </li> <li><a href="/wiki/graphics/2d/2d-animation">2D Animation</a></li> <li><a href="/wiki/graphics/2d/2d-particleeffects">2D ParticleEffects</a></li> <li><a href="/wiki/graphics/2d/clipping-with-the-use-of-scissorstack">Clipping, with the use of scissorstack</a></li> <li><a href="/wiki/graphics/2d/imgui">ImGui</a></li> <li><a href="/wiki/graphics/2d/masking">Masking</a></li> <li><a href="/wiki/graphics/2d/ninepatches">Ninepatches</a></li> <li><a href="/wiki/graphics/2d/orthographic-camera">Orthographic camera</a></li> <li><a href="/wiki/graphics/2d/packing-atlases-at-runtime">Packing atlases at runtime</a></li> <li><a href="/wiki/graphics/2d/pixmaps">Pixmaps</a></li> <li><a href="/wiki/graphics/2d/spritebatch-textureregions-and-sprites">SpriteBatch, TextureRegions, and Sprites</a></li> <li><a href="/wiki/graphics/2d/texture-compression">Texture Compression</a></li> <li><a href="/wiki/graphics/2d/tile-maps">Tile maps</a></li> </ul> </li> <li><a href="/wiki/graphics/3d/3d-graphics">3D Graphics</a> <ul> <li><a href="/wiki/graphics/3d/3d-animations-and-skinning">3D animations and skinning</a></li> <li><a href="/wiki/graphics/3d/3d-particle-effects">3D Particle Effects</a></li> <li><a href="/wiki/graphics/3d/3d-picking">3D Picking</a></li> <li><a href="/wiki/graphics/3d/decals">Decals</a></li> <li><a href="/wiki/graphics/3d/importing-blender-models-in-libgdx">Importing Blender models in LibGDX</a></li> <li><a href="/wiki/graphics/3d/material-and-environment">Material and environment</a></li> <li><a href="/wiki/graphics/3d/modelbatch">ModelBatch</a></li> <li><a href="/wiki/graphics/3d/modelbuilder-meshbuilder-and-meshpartbuilder">ModelBuilder, MeshBuilder and MeshPartBuilder</a></li> <li><a href="/wiki/graphics/3d/modelcache">ModelCache</a></li> <li><a href="/wiki/graphics/3d/models">Models</a></li> <li><a href="/wiki/graphics/3d/quick-start">Quick start</a></li> <li><a href="/wiki/graphics/3d/virtual-reality">Virtual Reality (VR)</a></li> </ul> </li> <li>OpenGL Utility Classes <ul> <li><a href="/wiki/graphics/opengl-utils/frame-buffer-objects">Frame buffer objects</a></li> <li><a href="/wiki/graphics/opengl-utils/meshes">Meshes</a></li> <li><a href="/wiki/graphics/opengl-utils/rendering-shapes">Rendering shapes</a></li> <li><a href="/wiki/graphics/opengl-utils/shaders">Shaders</a></li> </ul> </li> <li><a href="/wiki/graphics/clearing-the-screen">Clearing the screen</a></li> <li><a href="/wiki/graphics/continuous-and-non-continuous-rendering">Continuous and Non Continuous Rendering</a></li> <li><a href="/wiki/graphics/integrating-libgdx-and-the-device-camera">Integrating libgdx and the device camera</a></li> <li><a href="/wiki/graphics/opengl-es-support">OpenGL (ES) Support</a></li> <li><a href="/wiki/graphics/profiling">Profiling</a></li> <li><a href="/wiki/graphics/querying-and-configuring-graphics">Querying and Configuring Graphics (monitors, display modes, vsync, display cutouts)</a></li> <li><a href="/wiki/graphics/taking-a-screenshot">Taking a Screenshot</a></li> <li><a href="/wiki/graphics/viewports">Viewports</a></li> </ul> </div> </details> <p><a href="/wiki/html5-backend-and-gwt-specifics">HTML5 Backend and GWT Specifics</a></p> <details><summary>Input Handling</summary> <div> <ul> <li><a href="/wiki/input/input-handling">Input Handling</a></li> <li><a href="/wiki/input/accelerometer">Accelerometer</a></li> <li><a href="/wiki/input/back-and-menu-key-catching">Back and menu key catching</a></li> <li><a href="/wiki/input/compass">Compass</a></li> <li><a href="/wiki/input/configuration-and-querying">Configuration and Querying</a></li> <li><a href="/wiki/input/controllers">Controllers</a></li> <li><a href="/wiki/input/cursor-visibility-and-catching">Cursor Visibility and Catching</a></li> <li><a href="/wiki/input/event-handling">Event handling</a></li> <li><a href="/wiki/input/gesture-detection">Gesture detection</a></li> <li><a href="/wiki/input/gyroscope">Gyroscope</a></li> <li><a href="/wiki/input/mouse-touch-and-keyboard">Mouse, Touch and Keyboard</a></li> <li><a href="/wiki/input/polling">Polling</a></li> <li><a href="/wiki/input/simple-text-input">Simple text input</a></li> <li><a href="/wiki/input/vibrator">Vibrator</a></li> </ul> </div> </details> <p><a href="/wiki/internationalization-and-localization">Internationalization and Localization</a></p> <details><summary>Using libGDX With Other JVM Languages</summary> <div> <ul> <li><a href="/wiki/jvm-langs/using-libgdx-with-other-jvm-languages">Using libGDX With Other JVM Languages</a></li> <li><a href="/wiki/jvm-langs/using-libgdx-with-clojure">Using libgdx with Clojure</a></li> <li><a href="/wiki/jvm-langs/using-libgdx-with-kotlin">Using libGDX with Kotlin</a></li> <li><a href="/wiki/jvm-langs/using-libgdx-with-python">Using libgdx with Python</a></li> <li><a href="/wiki/jvm-langs/using-libgdx-with-scala">Using libgdx with Scala</a></li> </ul> </div> </details> <p><a href="/wiki/managing-your-assets">Managing your assets</a></p> <details><summary>Math Utilities</summary> <div> <ul> <li><a href="/wiki/math-utils/math-utilities">Math Utilities</a></li> <li><a href="/wiki/math-utils/circles-planes-rays-etc">Circles, planes, rays, etc.</a></li> <li><a href="/wiki/math-utils/interpolation">Interpolation</a></li> <li><a href="/wiki/math-utils/path-interface-and-splines">Path interface and Splines</a></li> <li><a href="/wiki/math-utils/vectors-matrices-quaternions">Vectors, matrices, quaternions</a></li> </ul> </div> </details> <p><a href="/wiki/networking">Networking</a></p> <p><a href="/wiki/preferences">Preferences</a></p> <details><summary>Third Party Services</summary> <div> <ul> <li><a href="/wiki/third-party/admob-in-libgdx">Admob in libgdx</a></li> <li><a href="/wiki/third-party/firebase-in-libgdx">Firebase in libGDX</a></li> <li><a href="/wiki/third-party/google-mobile-ads-in-libgdx">Google Mobile Ads in Libgdx (replaces deprecated AdMob)</a></li> <li><a href="/wiki/third-party/google-play-games-services-in-libgdx">Google Play Games Services in LibGDX</a></li> <li><a href="/wiki/third-party/pollfish-in-libgdx">Pollfish in libgdx</a></li> <li><a href="/wiki/third-party/proguard-dexguard-and-libgdx">ProGuard DexGuard and libGDX</a></li> <li><a href="/wiki/third-party/smaato-in-libgdx">Smaato in libGDX</a></li> </ul> </div> </details> <details><summary>Tools</summary> <div> <ul> <li><a href="/wiki/tools/2d-particle-editor">2D Particle Editor</a></li> <li><a href="/wiki/graphics/3d/3d-particle-effects">Flame</a></li> <li><a href="/wiki/tools/hiero">Hiero</a></li> <li><a href="/wiki/tools/overlap2d">Overlap2D</a></li> <li><a href="/wiki/tools/skin-composer">Skin Composer</a></li> <li><a href="/wiki/tools/texture-packer">Texture packer</a></li> </ul> </div> </details> <details><summary>Utilities</summary> <div> <ul> <li><a href="/wiki/utils/collections">Collections</a></li> <li><a href="/wiki/utils/jnigen">jnigen</a></li> <li><a href="/wiki/utils/reading-and-writing-json">Reading and writing JSON</a></li> <li><a href="/wiki/utils/reading-and-writing-xml">Reading and writing XML</a></li> <li><a href="/wiki/utils/reflection">Reflection</a></li> <li><a href="/wiki/utils/saved-game-serialization">Saved game serialization</a></li> </ul> </div> </details> <h2 id="articles">Articles</h2> <ul> <li><a href="/wiki/articles/getting-help">Getting Help</a></li> <li><a href="/wiki/articles/external-tutorials">External Tutorials</a></li> <li><a href="/wiki/articles/coordinate-systems">Coordinate Systems</a></li> <li><a href="/wiki/articles/memory-management">Memory Management</a></li> <li><a href="/wiki/articles/updating-libgdx">Updating Your libGDX Version</a></li> <li><a href="/wiki/articles/dependency-management-with-gradle">Dependency Management with Gradle: Adding Extensions and Third-Party Libraries</a></li> <li><a href="/wiki/articles/maven-integration">Maven Integration</a></li> <li><a href="/wiki/articles/creating-a-separate-assets-project-in-eclipse">Creating Asset Project in Eclipse</a></li> <li><a href="/wiki/articles/java-development-kit-selection">Java Development Kit - Selection</a></li> <li><a href="/wiki/articles/console-support">Console Support?</a></li> </ul> </div> </div> </div> </aside> <div class="copyright_footer"> <p style="font-size: 13px;margin-bottom: 0px !important;"> <b>© 2025 libGDX</b> • This wiki is a community effort. If you find information out of date or want to add some more in-depth explanations, you are very welcome to do the necessary changes. Before contributing, please take a look at our <a href="/wiki/misc/wiki-style-guide">Wiki Style Guide</a>. <br/> <br/> <b>If you need additional help, check out our community on <a href="/community/discord/">Discord</a>!</b> </p> </div> </section> </div> </article> </div> </div> <script src="/assets/js/main.min.js"></script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10