Performance, Battery, and Getting on the Store

Module 7 ยท Lesson 3 ยท ~40 min ยท pre-launch checklist

Your game runs beautifully on your dev phone. That's because your dev phone is a $900 flagship with a cool case and a clean battery. The median Android device out there is a 3-year-old phone with half a battery charge, thermal throttling, and 20 other apps fighting for memory. This lesson is the "make it actually ship" pass.

Profiling in Godot

Two built-in panels:

You want each frame <16.6ms (60fps) or <33ms (30fps, fine for a turn-based game). Over budget and the game janks.

Common mobile bottlenecks

  1. Too many nodes. A scene with 5000 nodes will lag on a mid-tier phone. Check with print(get_tree().get_node_count()). For Lexicon Duel you should be well under 200 during a duel โ€” if not, something's leaking.
  2. Fill rate on particles. A GPUParticles2D spewing 500 big transparent sprites over the whole screen shreds the fragment shader. Keep particle counts modest (<100 per emitter), keep them small.
  3. Unnecessary _process. Every node with a _process override wakes up every frame. Kill them when not needed: set_process(false). Prefer event-driven (signals) over polling.
  4. Font rendering. Using 10 different font sizes causes 10 texture atlas bakes. Pick 3 sizes, reuse.
  5. Large textures. Import an 8192ร—8192 background for a phone screen and you've wasted 256MB of GPU memory. Import Settings โ†’ Mipmaps on, clamp max size to what you actually need.

Battery life

Turn-based games should be gentle on batteries. Checklist:

# Global autoload โ€” toggle when entering/leaving menus
func enter_idle() -> void:
    OS.low_processor_usage_mode = true
    Engine.max_fps = 30

func enter_duel() -> void:
    OS.low_processor_usage_mode = false
    Engine.max_fps = 60

APK size

Your debug APK is probably 60-80MB โ€” acceptable. At 150MB+ you start losing Play Store installs. Culprits:

Signing for release

Debug keystore is for you. Release keystore is what the Play Store uses to identify this game as yours, forever. If you lose it, you lose the ability to update your app. Treat it like a master password.

keytool -v -genkey -keystore lexicon-duel-release.keystore \
  -alias lexicon-duel -keyalg RSA -keysize 2048 -validity 10000

It'll prompt for a password (use a strong one, save to a password manager), and some metadata (your name, org, country). Store the resulting .keystore file in a safe place โ€” not in git. Backup to iCloud/Drive, and to an external drive. Two copies minimum.

In Godot: create a second preset "Android Release," same settings as debug but:

APK vs AAB

The Play Store wants AAB (Android App Bundle), not APK. An AAB is a container the Play Store splits per-device to reduce download size. Same Godot preset, just toggle the "Gradle Build" + "Export Format: AAB" in the preset options.

APKs are still useful: for sideloading to friends' phones, for itch.io distribution, for ad-hoc testing. Maintain both presets.

The Play Console onboarding

This is where the weeks-long wait actually lives. Realistic timeline for a first-time publisher as of 2026:

Reality check From "I have a done game" to "on Play Store public listing" is realistically 4-6 weeks for a first-timer. Not because the game needs work โ€” because of Google's tester rule and review queues. Start the Play Console track as soon as you have an MVP, in parallel with polish.

Pre-launch checklist

Run through this before submitting:

Do this now

  1. Run the Godot profiler during a duel. Note any frame over 20ms.
  2. Check get_node_count() in your root scene during a duel.
  3. Measure the current debug APK size. If over 80MB, hunt the fat.
  4. Generate the release keystore. Back it up. Back it up again.
  5. If you're serious about shipping: start a Play Console account today, so the verification is happening in the background while you polish.