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;
}
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)