Skip to content

JSRF Unleashed 0.5.0

Choose a tag to compare

@JuMatt JuMatt released this 21 Oct 12:15
· 19 commits to main since this release

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.