Documentation Index
Fetch the complete documentation index at: https://mintlify.com/pojavlauncherteam/pojavlauncher/llms.txt
Use this file to discover all available pages before exploring further.
PojavLauncher cannot use OpenGL directly on Android the way a desktop JVM can. Instead it ships several rendering backends that translate Minecraft’s OpenGL calls into something an Android GPU can execute. Choosing the right backend for your hardware and Minecraft version is one of the most impactful performance decisions you can make. This page explains every available renderer, when to use each one, and how to configure them.
How renderer selection works internally
When PojavLauncher starts the JVM, JREUtils.loadGraphicsLibrary() maps the active renderer name to a shared library:
| Renderer name | Native library loaded |
|---|
opengles2 | libgl4es_114.so |
vulkan_zink | libOSMesa.so |
opengles3_ltw | libltw.so (ANGLE EGL) |
The renderer name is stored in the renderer shared preference key (LauncherPreferences.PREF_RENDERER, default "opengles2") and can also be overridden per-launch via the environment variable POJAV_RENDERER.
Available renderers
opengles2 — GL4ES on OpenGL ES 2.0
The default renderer and the most compatible option. GL4ES 1.1.4 (shipped as libgl4es_114.so) translates OpenGL 1.x/2.x calls from Minecraft into OpenGL ES 2.0 calls that any modern Android GPU can execute. Shown in the UI as “Holy GL4ES — (all versions, fast)”.
Best for:
- All Minecraft versions, especially 1.0 through 1.16.5
- Devices with older or budget GPUs that may not support GLES 3.0 reliably
- Troubleshooting — if another renderer crashes, fall back here first
Environment variables set automatically:
LIBGL_ES=2
LIBGL_MIPMAP=3
LIBGL_NOERROR=1
LIBGL_NOINTOVLHACK=1
LIBGL_NORMALIZE=1
vulkan_zink — Mesa Zink (OpenGL over Vulkan)
The highest-performance renderer for supported hardware. Mesa’s Zink driver implements OpenGL on top of Vulkan. PojavLauncher ships this as libOSMesa.so. On Adreno and Mali GPUs that have mature Vulkan 1.1+ drivers, Zink bypasses many of GL4ES’s translation overhead layers entirely. Shown in the UI as “Zink (Vulkan) — (all versions, mid)”.
Best for:
- Flagship Adreno 600-series and newer (Snapdragon 845+)
- Flagship Mali GPUs (Exynos / MediaTek with good Vulkan drivers)
- Minecraft 1.17+ where you want maximum draw call throughput
Minimum requirement: Vulkan 1.1 support on the device.
Zink-specific settings
| Setting key | Preference constant | Description |
|---|
zinkPreferSystemDriver | PREF_ZINK_PREFER_SYSTEM_DRIVER | When true, PojavLauncher uses the device’s system Vulkan driver instead of loading the bundled Mesa Turnip driver. On non-Adreno GPUs, leave this enabled. On Adreno GPUs, the bundled Turnip driver is usually superior — this preference is false by default. |
vsync_in_zink | PREF_VSYNC_IN_ZINK | Controls VSync specifically for the Zink backend. Sets POJAV_VSYNC_IN_ZINK=1 in the JVM environment. Defaults to true. |
When PREF_ZINK_PREFER_SYSTEM_DRIVER is false on an Adreno GPU, PojavLauncher sets POJAV_LOAD_TURNIP=1, which loads the bundled Mesa Turnip Vulkan driver in place of the system driver.
The Vulkan library path is passed via -Dorg.lwjgl.vulkan.libname=libvulkan.so.
opengles3_ltw — LTW (ANGLE / OpenGL ES 3)
An alternative renderer that uses the ANGLE EGL library (libltw.so), exposing OpenGL ES 3.0. Shown in the UI as “LTW (OpenGL ES 3) — 1.17+ only”. When this renderer is selected, PojavLauncher sets LIBGL_ES=3 and POJAVEXEC_EGL=libltw.so in the JVM environment.
Best for:
- Minecraft 1.17 and newer on devices where
vulkan_zink is unavailable or unstable
- Devices with solid GLES 3.0 driver support that do not have Vulkan
Minimum requirement: OpenGL ES 3.0 support on the device. The renderer is hidden in the UI if the device does not report GLES 3.0 or the LTW library is not bundled in the installed APK.
How to change the renderer
Global setting
Open Settings
From the main launcher screen, tap the Settings (gear) icon.
Go to Video
Tap Video in the settings menu.
Select a renderer
Tap Renderer and choose from the list. The choice is saved immediately as the renderer preference.
Per-profile override
Open the Profile Editor for a specific profile and set the pojavRendererName field to one of the renderer name strings listed in the table above. A per-profile renderer overrides the global setting only for that profile.
Surface mode: TextureView vs SurfaceView
PojavLauncher can render into either a TextureView or a SurfaceView. The setting is controlled by alternate_surface (PREF_USE_ALTERNATE_SURFACE).
| Mode | Setting | Notes |
|---|
| TextureView | alternate_surface = false | Default on lower-end devices. More flexible compositing. |
| SurfaceView | alternate_surface = true | Default on powerful devices. Lower latency; fixes rendering glitches on some GPU/driver combinations. |
If you see flickering, a black game area, or visual corruption, try toggling Alternate Surface in Settings → Video.
| Setting key | Preference constant | Effect |
|---|
force_vsync | PREF_FORCE_VSYNC | Sets FORCE_VSYNC=true in the JVM environment. Eliminates screen tearing at the cost of locking the frame rate to the display refresh rate. Defaults to true on powerful devices. |
vsync_in_zink | PREF_VSYNC_IN_ZINK | VSync specifically inside the Zink pipeline (see above). |
dump_shaders | PREF_DUMP_SHADERS | Sets LIBGL_VGPU_DUMP=1. Dumps compiled shaders to disk for debugging GL4ES issues. |
bigCoreAffinity | PREF_BIG_CORE_AFFINITY | Sets POJAV_BIG_CORE_AFFINITY=1. Pins the JVM to big cores on asymmetric (big.LITTLE) CPUs for more consistent frame times. |
sustainedPerformance | PREF_SUSTAINED_PERFORMANCE | Enables Android’s sustained performance mode to prevent thermal throttling over long play sessions. |
Renderer selection guide
Is your device running Minecraft 1.16.5 or older?
└── Yes → use opengles2
Does your device have Vulkan 1.1+ (Adreno 600+ or Mali G76+)?
└── Yes → try vulkan_zink first
└── Crashes or broken graphics? → fall back to opengles2
Running Minecraft 1.17+, no Vulkan or unstable Vulkan?
└── try opengles3_ltw (requires GLES 3.0)
└── Not available or crashes? → use opengles2
Seeing graphical glitches with any renderer?
└── Toggle Alternate Surface in Settings → Video
└── Disable force_vsync and try again
On 32-bit devices (ARMv7 / x86), Vulkan is rarely available and GL4ES has tighter memory constraints. Stick to opengles2 and keep RAM allocation at or below 696 MB.