github RenanQueiroz/mcla-recomp v0.3.0

5 hours ago

This is the performance release that v0.2.1 said was coming. On Direct3D 12 the graphics card has less to do (the pause menu and the map most of all), the game uses much less CPU while a frame-rate cap is set (the default 30 FPS cap included), and CPUs with 5 or fewer threads get a higher uncapped frame rate. There are also 16x anisotropic filtering by default, a Lowest graphics preset, sun glare that follows the real sun, and two launcher fixes. Everything is on by default and has an off switch (listed at the end of What changed). As before, the launcher and setup wizard build Midnight Club: Los Angeles Complete Edition (Xbox 360, USA/Europe, title 545407F8) from your own disc image, and no game data is in any of the files below.

All measurements are from one PC (Ryzen 7 9800X3D, RTX 5080, Windows 11) and the Ryzen's integrated Radeon graphics; small CPUs were imitated by limiting the game to some of that CPU's threads.

What changed

The pause menu and the GPS map are faster (#17). At higher resolutions the city behind them is now drawn in two passes instead of three. On the RTX 5080 at 2x (1440p, Direct3D 12) the pause menu went from 7.45 to 5.22 ms a frame (about 134 to 191 FPS) and the map from 4.98 to 4.17 ms, counting everything else in this release. As a side effect, a thin seam that v0.2.1 drew across these two screens at higher resolutions is gone. Off switch: --mcla_larger_tiles=false.

Direct3D 12 does less work per frame. Uploads of the game's memory to the graphics card are now copied together for a run of draws instead of between every draw (Vulkan already did this); on the Radeon, depth buffers stay compressed when they're read; and textures the game renders to are written straight into place at native resolution. Together with the other changes, Direct3D 12 frames are up to 25% shorter on the RTX 5080 at 3x and 6 to 7% shorter on the Radeon (see Performance). Vulkan is unchanged apart from the texture change (about 4% on the Radeon).

The game uses much less CPU while a frame-rate cap is set. Two threads used to wait for the next frame by spinning: the game's timer thread (a whole core at 6 or more threads) and, on NVIDIA with Direct3D 12, the Reflex driver's frame wait. Both now sleep on a precise timer instead, and Reflex's own wait only covers the last few milliseconds. At the default 30 FPS cap the game's CPU time per frame on the test PC went from 64.5 to 15.9 ms, about 1.9 cores busy down to 0.5, with frame pacing and latency unchanged. The Reflex part works only on NVIDIA with Direct3D 12; on AMD, Intel or Vulkan you get the timer part. Off switches: --mcla_timer_hr_at_cap=false and --mcla_reflex_sleep_assist=false.

CPUs with 5 or fewer threads run faster uncapped. On these CPUs the game now also stops two of its threads from waiting in fixed 7 ms steps, which held the uncapped frame rate near 145 FPS. In our imitation of a 2-core/4-thread CPU the uncapped frame was 31 to 35% shorter, and of a 5-core CPU 40% shorter; at a frame cap nothing changes. It is not turned on for 4-core CPUs without Hyper-Threading: in our imitation of one, two of five runs had a short audio dropout and one stuttered, for reasons we don't know yet, so those CPUs keep v0.2.1's behaviour for now. The game's log (CPU: line) says what it decided. The audio safety check that switches this off after a dropout no longer reacts to the silence when the game closes, and a first dropout now pauses it for a minute instead of switching it off for the whole session. Off switch: --mcla_small_cpu_defaults=false.

The sun's glare follows the sun. The game scales the sun's glare by how much of the sun is visible, but the emulator always reported "80% visible". It now reports the graphics card's real count: the glare is at full strength in open sky, fades as palms and buildings cover the sun, and no longer shines through buildings. Off switch: --occlusion_query_async=false (the old fixed glare).

Textures seen at an angle are sharper: 16x anisotropic filtering is the default (it was 4x), and it's a setting now (the launcher's Anisotropic filtering, and the pause menu's PERFORMANCE section). The cost was not measurable on the RTX 5080 and about 1.5% on the Radeon.

A Lowest graphics preset, and a fix to Low-end. Lowest is Low-end with the real-time shadows off: about 27% less frame time than no preset on the Radeon, at the price of all sun shadows. Low-end no longer redraws the far shadows only every 2nd frame, because they flickered in motion; that makes it an estimated 10% faster than no preset on the Radeon instead of the 12% measured before.

Launcher. The settings page's two columns are now always equal: one long choice ("Automatic (Vulkan on Intel and AMD RDNA integrated graphics, Direct3D 12 otherwise)") used to squeeze the other column. That choice now reads "Automatic (default)", with the explanation in its "i". The header shows the release version (v0.3.0) instead of a commit when you're on a release.

Every change has an off switch (type it under the launcher's Advanced › More mcla.exe options):

Change Off switch
Faster pause menu and map --mcla_larger_tiles=false
Direct3D 12 uploads copied together --d3d12_hoist_shared_memory_uploads=false
Compressed depth buffers on reads (Direct3D 12) --d3d12_depth_resolve_read_state=false
Textures written straight into place --texture_load_direct_unscaled=false
Less CPU at a frame cap (timer) --mcla_timer_hr_at_cap=false
Less CPU at a frame cap (NVIDIA Reflex) --mcla_reflex_sleep_assist=false
Small-CPU options --mcla_small_cpu_defaults=false
Sun glare from the real sun --occlusion_query_async=false
16x anisotropic filtering the launcher's Anisotropic filtering setting

Performance

Against v0.2.1 on the test PC, uncapped (median frame time, the same free-roam and driving route):

v0.2.1 v0.3.0 Change
RTX 5080, Direct3D 12, native, free roam 4.61 ms 4.16 ms -9.7%
RTX 5080, Direct3D 12, native, driving 4.32 ms 4.26 ms -1.5%
RTX 5080, Direct3D 12, 3x, free roam 8.00 ms 5.99 ms -25% (125 to 167 FPS)
RTX 5080, Direct3D 12, 3x, driving 7.82 ms 6.21 ms -21%
RTX 5080, Vulkan, native (free roam / driving) 4.22 / 4.63 ms 4.23 / 4.68 ms no change (within the run-to-run variation)
Radeon, Direct3D 12, native, free roam 37.7 ms 35.6 ms -5.7%
Radeon, Direct3D 12, native, driving 36.9 ms 34.3 ms -7.0%

At the default 30 FPS cap, the game's CPU time for each frame:

v0.2.1 v0.3.0 Change
RTX 5080, Direct3D 12, native 64.5 / 64.8 ms 15.9 / 19.7 ms -75% / -70%
RTX 5080, Direct3D 12, 3x 62.5 / 63.9 ms 15.8 / 17.7 ms -75% / -72%
Radeon, Direct3D 12, native* 87.3 / 85.3 ms 46.4 / 34.5 ms -47% / -60%

(free roam / driving.) On the RTX 5080 the frame rate held at 30 FPS with the same pacing. *The integrated Radeon can't quite reach 30 FPS at native resolution; it went from about 26 to 28 FPS.

Issues this release answers

  • #17 frame drops in the pause menu and the map at 1440p: faster, as above.
  • #18 high CPU and GPU usage: much less CPU at a frame cap, and shorter Direct3D 12 frames.
  • #15 and #21 choppy driving and audio on 4-thread CPUs: it depends on the CPU, and we'd like to hear which one you have (the CPU: line of the game's log).

Known problems

  • 4-core CPUs without Hyper-Threading don't get the small-CPU speed-up yet (see above). We imitated these CPUs and didn't run them for real, so a real one may behave differently.
  • The sun glare is a little stronger than before in open sky (it's at full strength there now), and the title screen's glare varies from start to start.
  • Fine dots may remain at the edges of palm leaves against the sky and in some soft shadows (as in v0.2.1).
  • The vinyls of the story's cars (Karol's Datsun in #14) are still not checked.

Not tested

Nothing has been run on Intel graphics, a discrete AMD card, the older Vega graphics (Ryzen 5700G), NVIDIA cards older than the RTX 50 series, a laptop with switchable graphics, a real CPU with 5 or fewer threads, Linux or the PS5 (the PS5 build applies the same patches; it doesn't use the Windows-only CPU changes). The release passed 25 smoke runs (both APIs at 1x, 2x and 3x, FSR, frame generation, HDR, both presets, a French profile and the Direct3D 12 debug layer) with no errors, and the rain check. If you try it, please tell us how it went in the issues, whether it works or not.

Installing or updating

Already have v0.2.1? Open the launcher, which shows An update is available, and press Update and rebuild: it downloads the new SDK bundle and rebuilds the game. This release also has a new launcher, which the launcher offers to install; afterwards its header shows v0.3.0.

New install: download MCLA-Setup.exe and run it. It is unsigned, so Windows SmartScreen may stop it the first time; click More info, then Run anyway. The launcher's setup wizard then builds the game from your .iso. It needs the internet and about 10 GB of disk.

Files

Release v0.3.0, built from commit 8f84971a573ad0b09a0976a45875317342cfaca0 by https://github.com/RenanQueiroz/mcla-recomp/actions/runs/40821965628.

Asset Size SHA-256
MCLA-Setup.exe 58.6 MB 3045d18525a1d7f4bdb26f4fe3075a870a52c73240283ac6163e53eb1d9aff54
MCLA-Launcher-v0.3.0-win-x64.zip 70.4 MB ee14dc4cd1a7ad581134ec9d02d552d6348003252e1815422cc45817391d625a
rexglue-sdk-f5337cdc-4586b1731d4f-llvm-mingw-20250709.zip 28.1 MB 35834d99153d0d20f6e6d2be73379de0ac7b1139a710c92bfca269abf810ac4c
rexglue-sdk-source-f5337cdc-4586b1731d4f.tar.xz 73.2 MB d4651be9bd8d493263d9c0c26f707ce1b6897a310f391c208fb3ded3771b304d
release.json 8.1 KB dc93e0584de83a6275fe045c6474e879d0895cb647c106236febbe79c18b10ba
NOTICES.txt 32.2 KB 4c9d64872ae5e16ef53cae6da4c86d98fc4c686b9a619c6cf25b5b00049a6a07
SHA256SUMS the sums of the six above

release.json is what the launcher's installer reads; NOTICES.txt has the licences and notices of everything in the assets. Every asset has a build-provenance attestation (gh attestation verify <file> -R RenanQueiroz/mcla-recomp).

  • MCLA-Setup.exe: the one file a player downloads. Run it: it installs the launcher for the current user (no administrator rights asked for) in %LOCALAPPDATA%\Programs\MCLA, makes a Start menu and a desktop shortcut and starts it; the launcher's setup wizard then builds the game from the player's own disc image. Unsigned, so Windows SmartScreen may warn (the README says how to go on). The launcher updates itself by downloading this asset (SHA-256 in release.json) and running it with --update.
  • Launcher zip: the same launcher folder as a zip, for anyone who wants it without the installer: unzip and run MclaLauncher.exe; .NET and the Windows App SDK are inside. Unsigned.
  • SDK bundle: the ReXGlue SDK (f5337cdc) with the fork's 70 patches (digest 4586b1731d4f), built with llvm-mingw 20250709, and FSR's two runtimes (FidelityFX eee08db1, built with the C runtime linked in, so no Visual C++ Redistributable is needed). scripts/make_pc.ps1 -Toolchain mingw -SdkBundle <this zip> -SdkBundleSha256 <the hash> uses it.
  • Source archive: the corresponding source of the bundle's GPL and LGPL parts (the SDK tree at the pinned commits with the patches applied, and the fork at this commit).
  • game in release.json holds the fingerprints of the supported game (names, sizes and SHA-256 of its files: no content) for the launcher's setup wizard.
  • No game data is in any asset. The game is built on the player's PC, from their own disc.

When publishing: leave the Target as it is (8f84971a), so that the tag is made on the commit this was built from. The tag must point at 8f84971a573ad0b09a0976a45875317342cfaca0, which release.json names; the launcher's installer checks that.

Don't miss a new mcla-recomp release

NewReleases is sending notifications on new releases.