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 inrelease.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 (FidelityFXeee08db1, 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).
gameinrelease.jsonholds 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.