Attempt Playback downloads 430K+
An open-source C++ replay system for recording and visualizing thousands of Geometry Dash attempts at once while staying practical at 240 Hz on laptop and mobile hardware.
The scale problem
Geometry Dash runs gameplay at 240 updates per second. A recorded update can include the player position, rotation, scale, gamemode, gravity, input state, and other states needed for playback. One hour of single-player gameplay produces 864,000 player-state updates. Dual mode doubles that number.
This large amount of data per hour, and the fact that many players play one level for tens or hundreds of hours creates a storage and runtime challenge. In my system, most replay data stays on the disk, and full attempts are loaded only when they are actually needed for playback. Even when loaded, they are quantized to reduce memory usage.
Storage architecture
The replay format stores a full keyframe periodically and uses smaller delta records for the frames in between. Player values are quantized depending on the precision needed, and boolean states are bit-packed. A separate attempt catalog lets the mod inspect which runs exist without loading all of their frame data.
Memory and playback
Loading fewer bytes helps with memory, but replaying thousands of attempts has another problem. Checking every loaded attempt every frame would be very expensive. Attempts are indexed by time and level position, so the mod filters only attempts that would be relevant to the current playback window. Next it chunks the attempts by starting timestep so only attempts that could start soon are validated and initialized. Player objects are reused which saves on initial creation time but also RAM usage. Ghosts that do not need an update can skip work.
These effeciency methods especially matter on mobile, where the mod has to share memory and frame time with the game and every other installed mod.
Filesize stress test
I benchmarked the file format on a real save with 9,015 attempts and 1,177,639 player-state records. It came from an unusually difficult practice session, and the resulting file was 11.07 MiB.
- Using the naive 32-byte fixed frame format with the same non-frame overhead would have taken about 36.57 MiB.
- My compressed file is about 69.7% (3.3x) smaller than the fixed-record estimate.
This stress test is harder on the format than a typical session because the attempts were extremely short. The median was only about 0.42 seconds, while normal attempts are often several seconds or longer. As a result, per-attempt metadata takes up a larger share of this file than it normally would.
Compatibility and real users
The mod hooks into a closed-source game through Geode SDK and runs alongside other mods that may change the same game systems. Some bugs only appear on one platform or with a particular combination of mods, so compatibility work often means reproducing issues from user reports and tracing conflicts through hooks or game states. With 300k+ unique installs, there are a lot of potential conflicts. I let users report bugs and crashes to me through a form in a discord server, where I can ask them questions to narrow down how and why the issue occured.
The full project is open source on GitHub.