BIG DOG — two versions on this image. bigdog play the COMPILED-RENDERER version (SPACE or W flaps) bigdog-demo same, flying itself, for watching the frame rate tclsh /home/bigdog.tcl the original, Tcl draws every pixel WHAT CHANGED The game logic is still Tcl. The pixels are not: /bin/fbdraw is a static wasm32 C binary that owns /dev/fb0, and Tcl describes each frame to it as a few dozen command lines over a pipe. Measured in one boot, 300 frames at 480x320, under the Node runner: home/bigdog.tcl (Tcl draws every pixel) 602 ms/frame home/bigdog-fbdraw.tcl (fbdraw renders) 2.1 ms/frame The old one was never limited by the framebuffer — the device does 367 MB/s. It was limited by an interpreter touching pixels one list element at a time. The new version asks fbdraw for the screen geometry instead of assuming it. That matters here: the browser framebuffer is 640x480 with a stride of 7684 bytes (sized for the maximum mode, not 640*4), while bigdog.tcl has 7680 baked in as a literal. WHY IT IS FAST mmap(/dev/fb0) fails ENODEV here, and pwrite64 is ENOSYS on the wasm32 syscall table, so a frame costs lseek+write syscalls. fbdraw keeps the last flushed frame and writes only rows that actually changed; a dog crossing a static sky dirties a fraction of the screen and the rest cost a memcmp. Source: demos/bigdog-fbdraw.tcl and packages/custom/fbdraw/fbdraw.c