November 26, 2025
Retro wars rebooted
Making my 1970's-style renderer multi-threaded
Indie dev handcrafts retro 3D, comments ignite 70s vs 80s vs GPU brawl
TLDR: A dev made a hand-rolled retro 3D engine in Flutter and shifted it to multi-threading to cut CPU use and run on low-end PCs. Comments erupted over whether the aesthetic is 70s or 80s and if a GPU could do it just as well, framing an art-vs-efficiency showdown.
An indie dev built a throwback 3D engine in Flutter—think “1970s sci‑fi meets modern military”—then pushed it off the main thread using Dart’s “isolates” (threads that don’t share memory) to save CPU and make it run on “potatoes.” He used Flutter’s Canvas.drawVertices (a low-level draw call) and streamlined memory with TypedData so frames don’t constantly allocate and trash memory. After profiling on Windows showed rendering eating 20–30% of CPU, the move to multi-threading felt like a must for smooth gameplay. Nerd flex? Absolutely. But the comments turned it into a vibe war.
The community split into two spicy camps. One group asked if this look is actually 80s—PeterHolzwarth wondered if the decades have “blended into one,” cue jokes about “CRT chic” and neon mech HUDs. The other camp demanded: why not just use the GPU? Dwedit argued the screenshots could be done with Direct3D 9, sparking hot takes about control vs convenience. Purists cheered the bespoke software renderer—“art over shaders!”—while pragmatists waved the “write a shader” flag and linked docs on Dart isolates and even Flutter’s drawVertices. The thread turned into a popcorn-worthy clash of aesthetics vs efficiency, with bonus memes about “potato mode unlocked” and “decade drift.” In short: passion project, upgraded; comments, on fire.
Key Points
- •A custom software 3D renderer was built in Dart for a specific retro aesthetic within a Flutter game.
- •Initial rendering was single-threaded, using Flutter’s Canvas.drawVertices to send triangle lists to the GPU.
- •Memory allocations were minimized by using Dart TypedData (Float32List) for contiguous buffers, reducing GC overhead.
- •Profiling on Windows showed the renderer consuming ~20–30% CPU, prompting a move to a separate thread.
- •Dart’s isolate-based concurrency (no shared mutable memory), inspired by Erlang and WebWorkers, is introduced as the approach for multithreading; Canvas.drawVertices must remain on the main thread.