Progress history
From 6 to 57 frames per second
The port started on CheerpJ, a Java runtime for the browser, then moved to ahead-of-time WebAssembly. Numbers are from the development PC (RTX 5090) in headless Chromium; early and late runs used different scenes, so treat them as orders of magnitude.
In-world frame rate
World load time
Milestones
The real game reaches its main menu and a world in the browser
CheerpJ runs the game's Java. Native libraries replaced: lighting ported to JavaScript, the population manager to Java, polygon clipping bridged to WebAssembly libraries, SQLite on sqlite-wasm, OpenGL translated to WebGL 2. About 6 fps in the world.
CheerpJ tuned, then the WebAssembly build
A pathfinder rebuilt every frame was the biggest CheerpJ cost: 9 to 10 fps, world load down from about 430 to 240 seconds. The same game compiled ahead of time with TeaVM loads a world in 85 seconds and draws about five times as many frames, and becomes the default.
Bug pass
Frozen characters (a missing text-collation class stopped every animation group loading), a hang when quitting to the menu, saves that never stored the player, a 55-second freeze at start-up (first screen after 30 to 48 seconds instead of 101 to 124), sitting and resting, and starts from other computers.
Frame-rate pass
The interface was redrawn every frame; it now redraws 20 times a second, the frame cap rose from 60 to 240, and string comparisons got faster. Walking went from 45 to 57 fps, standing from 54 to 75.