All games

X-Moto

Platinum ยท 96 0.4 h played, 0 crashes

A 2D motorbike trials game: ride through physics-based levels without falling off, collecting strawberries.

Genre
racing platformer
Players
single player
Input
supports gamepad
View
2D side-on
Keywords
bike physics levels

How it's built, patched and set up for its played test. The numbers are under Test runs.

X-Moto 0.6.3 runs at 1920x1080 with the right picture and sound. Walnut’s package batches the game’s OpenGL drawing (the first version made about 18,500 GL calls a frame, now 165), which took the benchmark replay from 44 to about 160 frames a second.

X-Moto 0.6.3 runs at 1920x1080 with the right picture and sound. Our package batches the game’s OpenGL drawing (a frame went from 18,500 GL calls to 165), which took the benchmark replay from 44.5 to about 160 fps; its played sessions ran at the 60 fps vsync cap with clean sound (“flawless”, the player). It is one of the games where game-side batching paid most.

Packages and patches

xmoto, xmoto-data (0.6.3+repack-1+ps3.N, packages/xmoto), replacing Debian’s.

Patch What Switch
0001 DrawLib’s GL state set only when drawing; its primitives batched per state run XMOTO_GL_BATCH
0002 the level’s blocks and edges drawn from one buffer XMOTO_GL_BLOCKS
0003 XMOTO_BENCH_LOOPS=N plays the benchmark replay N times
0004 batches written straight into a mapped 2 MiB GL_STREAM_DRAW buffer instead of client memory Mesa copies per draw XMOTO_GL_STREAM=1 (off by default); XMOTO_GL_STATS
0005 game controllers: a fixed scheme next to the keyboard

Controllers (0005). Controller N (the N-th SDL game controller) plays player N, no binding needed, at the same time as the keys: right trigger or R1 accelerate, left trigger or L1 brake, d-pad or left stick lean, Cross turns around, Triangle restarts the level, Square restarts from the checkpoint, Start pauses. The table is padBindings in Input.cpp; Options > Controls > Controller lists it. Pads plugged in later take the first free player; controller events are always on, whatever “Enable joysticks” says. Menus take the d-pad, left stick, Cross and Circle.

packages/xmoto/test/glbatch-test.sh checks the GL layer on the PC’s llvmpipe: 400 frames of a random scene, the same pixels with and without the stream buffer, no GL errors (make test ONLY=xmoto-glbatch, needs make xmoto-work).

How it performs

  • Bench (batch 2026-10-18-batch16, kernel .433, x3): base 160.7 steady, 1% low 106.7, no gameplay stalls, longest 43 ms, 51 MB free, 37 MB of VRAM, 148 underruns; stream (0004) 162.1 (+1%), 106.3, 0.4 s, 380 ms. In batch 2026-10-18-mesa-416-hot-spots (one run each) base 160.4 against stream 163.1, CPU 298 against 282 s. So the stream buffer gives about 1% and less CPU, and the hitches move from run to run: no default change yet (the investigation).
  • On the SSD root with ps3rsx’s shadow_fast (batch 2026-10-19-ssdroot2-shadow-fast): 159.0 against 158.4, no effect. The microphone hears the game’s music and engine in all 8 clips, with 200-218 ALSA underruns a run.
  • Memory: 49 MB Rss, nothing swapped, 0.3 MB free in its heap (nothing to cut).
  • Played (2026-10-23 and 10-24, three sessions up to 26 minutes): 60 fps median, 1% low 34-44, 0.3-1.3 s of stutter a minute.

The benchmark (recipe) plays the “credits” replay, which ships inside xmoto.bin where --replay doesn’t read it, so assets/xmoto-credits.rpl is it extracted. --timedemo --benchmark draws every frame, prints Average framerate and exits; it sets no swap interval itself, so vblank_mode=0. The replay runs in real time (about 144 s), so two passes: the first is the warm-up. Since the steady state, X-Moto’s fps value is the game’s average over the whole replay, not the HUD median (--hud xmoto keeps the old meaning).

Known problems

  • The engine sound is quiet under the music, not missing.

Investigations

Build

Packagesxmoto, xmoto-data
Suitein the game suite (known to run with its sound), free data
Game datacomes with the packages

Our source packages

Played test

What a played session sets up (rating/test.toml); the medal comes from these sessions only.

Processxmoto
Set aside~/.config/xmoto, ~/.local/share/xmoto (the game starts on fresh defaults)
Command/usr/games/xmoto --nowww -fs -res 1920x1080
Sound read at20 s

Investigations