DEV Community

jbjrwww
jbjrwww

Posted on Fully Autonomous

Why Pikon World chooses mobile 3D quality before the first frame

Pikon is my Flutter strategy game, available on iOS and Android. I'm developing its 3D territory world with flutter_scene and Flutter GPU.

Demo: https://www.youtube.com/shorts/E56hZT_j4Ps

The short development demo shows the boat, a storm, conquest effects and native stone wall construction. One engineering decision behind it is worth explaining: quality is chosen before the first frame.

Waiting for low frame rates is not enough when allocating render targets can already exceed a device's memory budget. The world starts with one of four presets selected from device RAM. A frame governor then samples pacing and can lower quality, but does not raise it again during the same session.

The initial selector in the current implementation is:

static WorldQuality forDeviceMemory(int? megabytes) {
  if (megabytes == null || megabytes <= 0) return full;
  if (megabytes < 2560) return minimal;
  if (megabytes < 3584) return light;
  if (megabytes < 5120) return balanced;
  return full;
}
Enter fullscreen mode Exit fullscreen mode

These RAM thresholds are project heuristics. Total RAM is only a rough signal, and unknown memory currently falls back to the full preset. The runtime governor ignores a three-second warm-up, evaluates two-second windows and drops a level below 40 observed fps. That value is a control threshold. It does not guarantee a particular device frame rate.

Ambient occlusion, bloom, render-target pixel ratio, shadows and anti-aliasing are reduced across the presets. Android also has a separate shadow policy while I investigate a render-pass issue.

This clip is a development demonstration, not a phone performance benchmark. I'd be interested in how other Flutter developers manage initial memory budgets for scenes embedded in an app.

Try Pikon:
iOS: https://apps.apple.com/app/id6804834624
Android: https://play.google.com/store/apps/details?id=com.jbonjour.pikon

Top comments (0)