Repository navigation
JSRF Unleashed 0.5.0
Jet Set Radio Future, natively on Mac, Windows, Linux, Android, iPhone and iPad. You need your own copy of the game (the standalone US disc): these downloads are the engine only.
| Download | For |
|---|---|
| JSRF-Unleashed-windows-x86_64.zip | Windows 10 and 11, 64-bit — tested under Wine and CrossOver |
| JSRF-Unleashed-macOS-arm64.zip | macOS 12 or later, Apple Silicon |
| JSRF-Unleashed-linux-x86_64.tar.gz | Linux x86_64, glibc 2.34 or later |
| JSRF-Unleashed-android-arm64.apk | Android 10 or later, 64-bit, OpenGL ES 3.0 — tested in the Android emulator |
| JSRF-Unleashed-iOS.ipa | iPhone and iPad, iOS 15 or later (AltStore, SideStore, Sideloadly) |
This version is about stutter: the moments where the game freezes for a fraction of a second, most often when a new area or a new part of one appears.
New textures appear about six times faster
The first time the game uses a texture, it is converted on the CPU, and a new area brings dozens at once. When 99th Street starts, 59 arrive in one frame and 65 in another: each was a freeze of about a fifth of a second, and new parts of an area coming into view mid-play cost smaller ones. The conversion did the same work up to sixteen times per pixel; it does it once now. The same 59 textures take about 35 ms, and the pixels are exactly the same.
Shaders are kept, and built before the game needs them
The first time the game draws something new (an effect, a skater, part of a stage), its shaders have to be built, and the game waits for them. Every shader built is now kept, in a shaders folder in the app's own data folder (not the game folder), and the next time the game starts they are built again before they are needed: on Metal in the background while the title screen runs, on OpenGL a few at a time on menus and loading screens. Where the graphics driver allows it (Windows, Linux, Android), they are kept already compiled and load almost at once.
The gain depends on the renderer. With OpenGL on a Mac, macOS keeps nothing between sessions: four minutes on 99th Street spent about 430 ms building shaders every time, and now about 50 ms. On Linux, a shader that took 13.8 ms the first time loads in 1.5 ms. On Metal, macOS already keeps compiled shaders itself, so there is little left to gain. The very first time a shader is needed on a machine (the first visit to an area), it is still built on the spot.
The folder can be deleted at any time; it is rebuilt as you play.
No more grey spikes
Some objects shot long grey spikes across the screen for a moment, for instance on the staircase that winds around the garage's centre platform. A step of the game's vertex programs (the reciprocal, RCC) lost its sign, so points just behind the camera were thrown across the screen. It keeps its sign now, as on the console.
Mac: no stutter with the window covered
macOS slows down the timers of an app whose window is covered (App Nap), and the game paces itself, streams and plays its music on timers: a covered window stuttered in quarter-second stalls. The game now tells macOS it needs its timers on time while it runs.
The log says what each stutter was
Every frame that took one and a half frames or longer is written to last-run.log with what happened in it: shaders built, textures converted, or the game itself. If you report stuttering, attach the log: it says which one it was.
How it was tested
On the Mac, with Metal and with OpenGL: New Game, then 99th Street, skating around it for four minutes, each renderer with and without the shader cache and with the old and the new texture conversion; the numbers above come from those runs, and the final Mac app ran the title on both renderers. The new texture conversion was checked against the old one, pixel for pixel, on DXT1, DXT3 and DXT5 at many sizes. The shader cache also ran on Linux (Mesa) with its files empty, filled and damaged. The final Windows build ran under Wine twice (its shaders built and saved the first time, loaded already compiled the second), and the final Linux build ran on Mesa; the Android and iPhone builds were built and checked, not run.
Every download is 0.5.0
All five are built from the same tag. On iPhone, AltStore and SideStore show 0.5.0 in My Apps as an update if you installed from the JSRF Unleashed source. On Android, the APK installs over the previous one.
Everything else is in the changelog, and installation instructions are in the README.