This release goes on top of v0.1.3. It raises the frame rate where the CPU set the limit, makes the game use the dedicated graphics card on PCs with two GPUs, brings back the cars' vinyls, removes the lattice of dots on poles, trunks and posts, fixes the radio, adds FSR upscaling and a low-end preset for weaker graphics cards, makes the Automatic graphics API choose by the kind of graphics card, gives the launcher a Language and a Player name setting, and fixes the setup wizard's "GitHub didn't answer in time" error. 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.
What changed
Performance
Measured against v0.1.3 on our test PC (Ryzen 7 9800X3D, RTX 5080, Windows 11; the same free-roam and driving route, uncapped, 3 runs a side in turn after a warm-up; median frame time):
| v0.1.3 | this release | |
|---|---|---|
| RTX 5080, Direct3D 12, native resolution | 6.84 ms (146 FPS) | 4.65 ms (215 FPS), -32% |
| RTX 5080, Vulkan, native resolution | 6.82 ms (147 FPS) | 4.21 ms (238 FPS), -38% |
| RTX 5080, Direct3D 12, 3x | 8.30 ms | 7.89 ms, -5% |
| RTX 5080, Vulkan, 3x | 8.14 ms | 7.90 ms, -3% |
| Integrated Radeon of the Ryzen, Direct3D 12, native resolution | 39.4 ms (25.4 FPS) | 36.7 ms (27.3 FPS), -7% |
At native resolution this PC was held by the CPU, near 145 FPS; that is the gain in the first two rows (the next section). At 3x the graphics card sets the limit. On the integrated Radeon the gain is the faster resolves (below); its speed drifts by up to 30% within minutes, so that row is 6 runs a side in v0.1.3, this release, this release, v0.1.3 order, each run compared with its v0.1.3 neighbours (from -6.3% to -7.5% in all six; driving -7% too). The 1% slowest frames moved with the median, except driving at 3x on Direct3D 12, where they were 5% longer in our runs, inside how much those runs varied (up to 10% between two runs of the same build).
CPU
- The frame rate is no longer held near 145 FPS on PCs with 6 or more logical processors. A thread of the game slept 7 ms between rounds even when the main thread was waiting for it. It is now woken when that happens (
mcla_pump_wake_on_demand). On the test PC the city runs uncapped at 217 to 240 FPS instead of 143 to 145, with 16, 8 or 6 logical processors; the 120, 60 and 30 FPS caps and the audio are unchanged. - On PCs with 5 or fewer logical processors the timer thread no longer keeps a core busy (
timer_queue_hr_wait). With 4 logical processors the game uses 23 to 58% less CPU, the uncapped frame rate is 17 to 21% higher, and the slowest 1% of frames went from 27 to 30 ms to 10 to 12 ms. - The game picks between the two by counting the logical processors it may use, at every start, and writes one line to the log (
CPU: 16 logical processors: ...). A value you set yourself wins. Windows only: Linux and the PS5 keep both off. Measured only on the test PC limited to fewer processors, not on a slower CPU. - Fewer locks in the game's atomic operations (on by default). The console's Interlocked helpers used to take one global lock shared by every thread; the check showed the lock protects nothing the atomic compare-and-swap does not, so they now run without it. The render thread uses 3 to 12% less CPU.
--guest_atomics_lock_free=falsetakes the lock again. - Off by default, for troubleshooting or experiments: a timed wait for the main thread (
--mcla_poll_wait=true), a cap on the game's frame-pacing sleep (--mcla_pump_sleep_max_ms, which caused audio underruns at 4 logical processors: do not use it), and the sampling profiler and other development tools inlauncher/dev.
Graphics
- The game uses the dedicated graphics card on PCs with two GPUs (#1, #15). It took the first GPU Windows listed, which on a laptop with switchable graphics is usually the integrated one, at a few frames per second. It now takes the high-performance GPU, or the one Windows' Settings › System › Display › Graphics gives
mcla.exeif you set one there. The log says which (GPU: ...). Ad3d12_adapterorvulkan_deviceyou set still wins, and--mcla_prefer_dedicated_gpu=falsegoes back to the first GPU. Not tried on a laptop with switchable graphics (our PC lists its RTX first); if you have one, please tell us which GPU the log names. - The cars' vinyls are back (#11, #14). The game paints a car's vinyls on the graphics card and then reads the picture back with its own code, which the emulator didn't allow (doing it for everything, as Xenia's readback setting does, is very slow). The game now reads back just that picture, while the cars of a race load. Checked in the arcade race Sunset and Vine: the opponents carry their liveries on Direct3D 12 and Vulkan, also in a second race. Nothing is read back in free roam or the menus (by a log of every copy the game makes there). Not checked: your own vinyls from the editor, the story's cars, and whether they last after a save and a load.
--mcla_vinyl_readback=falseturns it off. - The lattice of dots on poles, trunks and posts is gone (#8). The game uses "alpha to mask" to dither foliage, and on PC the alpha of solid objects comes out a hair under 1.0, so one pixel in every 2x2 lost its edge sample and showed what was behind it. The emulator now allows for that rounding (
alpha_to_mask_tolerance;=0turns it off). In a test scene the dotted pixels on a lamp pole went from 87 to 20 on Direct3D 12 and from 84 to 42 on Vulkan, and the regular grid in tree leaves against the sky is gone. The dithering the game does on purpose (foliage edges, distant trees) is unchanged. Not checked on AMD or Intel graphics. - FSR upscaling (#9: "is 1080p render res possible?"). With FSR as the anti-aliasing, the 3D scene can be drawn at a smaller size and rebuilt to the full size by AMD FSR 3.1, while the HUD, the menus and the bloom and tone mapping stay at full size and sharp. The launcher has a new FSR upscaling row and the pause menu's Anti-aliasing row has the same levels: Ultra Quality (4/3: the scene at exactly 1080p when the resolution is 2x, 1620p at 3x), Quality (1.5x), Balanced (1.7x) and Performance (2x). Ultra Quality is the way to a 1080p scene, since the resolution setting only takes whole numbers (a 1.5x setting in
mcla.tomlis not possible). It is off by default. It costs some sharpness (about 19% less fine detail at Ultra Quality and 33% at Performance than FSR at native resolution, on 4K stills) and can leave faint trails behind fast traffic. On an RTX 5080 at 3x the gain is small (8.2 to 8.6 ms a frame against 9.4 ms with FSR at native resolution); on a weak graphics card it saves more (the integrated Radeon of a Ryzen 7 9800X3D at 2x: 175 ms a frame at Quality and 147 ms at Performance against 204 ms with FSR at native, still not a playable frame rate). Works on Direct3D 12 and Vulkan. It needs the FSR runtime (included in the release) and does not apply to the shadow maps and the environment map. - Screen scaling filter. How the finished picture is scaled to your window or screen when the sizes differ: Bilinear (as before, the default), FSR 1 (sharpest when enlarging) or CAS (sharpening). Not used with HDR output or frame generation, which always scale bilinearly. Read at start-up, so it is in the launcher and
mcla.toml, not in the pause menu. - Graphics preset. Low-end turns anti-aliasing and the full-screen blur off, and draws the far sun shadows every 2nd frame and the car environment map every 4th (the last picture is kept in between). On an integrated Radeon that is about 11 to 12% less frame time at the game's own resolution; the price is jagged edges and shadows that update less often. An option you set by hand keeps its value. The default is Custom (nothing changes). The three update intervals are also separate settings.
- Faster resolves on weak graphics cards. The shaders that copy the finished scene out of its render target now ask for several pixels at a time instead of one after another. It is on by default and gives exactly the same pictures (0 of 12,200 checked resolves differ, on the integrated Radeon at the game's own resolution, at 2x, in a race, and on Vulkan, and 0 of 3,900 more with FSR upscaling on, in a build with this release's resolve patches). On the integrated Radeon of a Ryzen 7 9800X3D it made the resolves 8.4 to 5.6 ms a frame at the game's own resolution (free roam, Direct3D 12), most of the 7% in the table above; on the RTX 5080 the resolves are a little shorter (1.17 to 1.02 ms at 3x on Direct3D 12) and the frame hardly moves. It does not apply to the resolves FSR upscaling stretches.
- The Automatic graphics API now chooses by graphics card. Automatic uses Vulkan on Intel graphics and on the integrated AMD graphics of the RDNA generation (such as the Ryzen 7 9800X3D's), and Direct3D 12 on everything else: NVIDIA, AMD graphics cards, and the integrated Vega graphics of the older Ryzen APUs (such as the Ryzen 7 5700G). It decides on the GPU the game uses (above), so an Intel + NVIDIA laptop gets Direct3D 12 on the NVIDIA card. The one it picks is marked (recommended) in the launcher's list. Before, Automatic always meant Direct3D 12. Pick Direct3D 12 or Vulkan yourself to override it. This is the one change here that moves existing players: an Intel or Radeon-integrated PC that was on Automatic will start on Vulkan after the update. It was measured only on the Ryzen 9800X3D's Radeon (Vulkan 6 to 10% faster there); Intel is not measured, it follows from the SDK using a slower Direct3D 12 path for Intel. If it gives you trouble, choose Direct3D 12.
Pause menu
- The menu no longer changes size while you step the Graphics API or Resolution rows. The game sizes the whole menu to its widest label, and the "(RESTART NEEDED)" these rows showed after a change made it jump larger and back. They now say "(NEXT START)" all the time.
- The Graphics API row could crash the game when stepped more than once (v0.1.3 too). We did not find the cause, but with the change above it did not happen in 20 test runs of this release, against 4 crashes in 22 runs before it. If it happens to you, change the API in the launcher and please tell us.
Audio
- The radio no longer drifts out of balance (#2, and the radio part of #7). The game plays a stereo song as two separate mono streams, one per channel, and the audio decoder in the SDK dropped a short piece of each (one frame of 512 samples, every 10 to 20 seconds, each channel at its own moments). The two channels then slid apart by a few milliseconds more each time: the stereo image wandered, the sound got a comb-like "reverb", every loss was a click, and the song ran ahead of where it should be. This release carries the fixes that Xenia Canary and Xenia Edge made to the same decoder. Compared with FFmpeg's decode of the same data, the old decoder lost 6 to 11 frames in the first 95 seconds of the radio in every one of 11 runs; the fixed one lost none in 9 runs (4 of them with the build that is released) and matches FFmpeg sample for sample. With only 4 logical processors (two cores) the old decoder lost 7 frames and the fixed one 0. Nobody has listened to the result yet, and the static and reverb on voices in cutscenes that #7 mentions could not be reproduced (the test route does not reach a cutscene), so please say if it is still there.
--xma_canary_fixes=falsegoes back to the old decoder.
Launcher and setup wizard
- Language (#12). A Language row in the launcher: English (the default), French, German, Italian or Spanish, the five languages the game has text for. Read when the game starts. The radio is the game's own, and the spoken lines were not compared between languages.
- Player name. A box in the launcher for the name the game shows for you: up to 15 letters, digits and spaces (empty:
User, as before). Read when the game starts. It is the profile's name. - "GitHub didn't answer in time" is fixed (#13). The wizard waited for an IPv6 address that some networks advertise but do not route, until its timeout, while a browser tries IPv4 after a quarter of a second. The launcher and wizard now connect the same way, say which stage failed (name lookup, connecting, the secure handshake, waiting for the answer, the server's reply) and which host, try the release information a second time and then through GitHub's API, and have a Copy details button and Use files I downloaded: you pick a folder with the files from the Releases page and the wizard installs from it (every file is still checked against
release.json). The launcher's update check says why it could not check. - The launcher's Automatic graphics API and its shader check follow the GPU the game will use (above).
Issues this release answers
- #1 and #15 low frame rate on PCs with two GPUs: the game takes the dedicated GPU (the likely cause; not reproduced here).
- #2 radio balance: fixed in the decoder (measured; not heard).
- #7 partly: the radio part is the same fix. The RX 6600 XT's Vulkan being 20 to 25% slower than Direct3D 12 is why Automatic keeps Direct3D 12 on discrete AMD cards. The static and reverb in cutscenes is not confirmed fixed.
- #8 dots on opaque objects: fixed (alpha to mask tolerance).
- #9 1080p render resolution: FSR upscaling, Ultra Quality at 2x.
- #11 vinyls: fixed for the cars of a race. The soft smear over the plate and taillights on Vulkan is not fixed yet (below).
- #12 language: the Language setting.
- #13 "GitHub didn't answer in time": the network code.
- #14: the vinyls (above; the story's cars not checked); Automatic keeps the Ryzen 5700G's Vega graphics on Direct3D 12, avoiding the Vulkan problems reported there; the Player name setting answers the question about changing the nickname.
Known problems
- On Vulkan, a soft smear can cover your car's plate and taillights while you turn the camera around the car (#11; it comes from the wheels' motion blur). Direct3D 12 doesn't have it, and it is the default on NVIDIA and AMD graphics cards.
--mcla_vulkan_depth_convert=truealso removes it on Vulkan, but costs 21 to 33% of the frame on the graphics card, so it is off. A fix is being worked on. - Fine dots may remain at the edges of palm leaves against the sky and in some soft shadows; we could not tell yet whether that is the same problem as #8 or the game's own dithering.
Not tested
Tested on Windows with an NVIDIA RTX 5080 and a Ryzen 7 9800X3D, and (for the graphics changes) on the Ryzen's integrated AMD Radeon graphics; the CPU changes and the audio on that PC limited to 16, 8, 6 and 4 logical processors. Nothing has been run on Intel graphics, on a discrete AMD card (such as the RX 6600 XT of #7), on the older Vega graphics (Ryzen 5700G), on a laptop with switchable graphics, on a CPU that is slower rather than narrower, on Linux or on the PS5 (the PS5 build applies the same patches and lists them, untested; the CPU and GPU choices are Windows only). Nobody has listened to the radio fix, and no test route reaches a cutscene, the garage or the vinyl editor. If you try it, please report how it went in the issues, whether it works or not.
Installing or updating
Already have v0.1.0 to v0.1.3? Open the launcher. It shows An update is available. Press Update and rebuild; the SDK and the game are rebuilt, and this time the game is recompiled completely (the lock-free atomics change the code generator's template), so it takes minutes rather than the seconds of the last update (from source, SDK and game took about 3 minutes on our test PC). This release changes the launcher too (Language, Player name, the network code, the GPU choice), so it offers to update itself as well.
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.2.0, built from commit f0af66ad51f43d3b3a41eb90ce656ee6de57ca09 by https://github.com/RenanQueiroz/mcla-recomp/actions/runs/40636471110.
| Asset | Size | SHA-256 |
|---|---|---|
MCLA-Setup.exe
| 58.6 MB | d07d0388938ba76cec11e7d562d4066844a008b59e710aef006488c042cd5e2e
|
MCLA-Launcher-v0.2.0-win-x64.zip
| 70.3 MB | 6c394010187a5a7a415ef71232df6611248569f1e1657a88b0eefa4252c39a87
|
rexglue-sdk-f5337cdc-cae6528aecb5-llvm-mingw-20250709.zip
| 27.9 MB | a117d3ab8b22ae30c66f2838153ee2c0fb9195830bd4d970edcddc173dc175d7
|
rexglue-sdk-source-f5337cdc-cae6528aecb5.tar.xz
| 73.0 MB | c8c25334629815bd62d3cf39cf888d15a96b0dca7356e9b8526733a82361f3b4
|
release.json
| 8.1 KB | 18737acc157c03e3bc26e567d9b0cae258ed5c48761f6e510cba2afe846ec8e8
|
NOTICES.txt
| 31.9 KB | 8ab0cbda6a68f630b80294907b51d35426566778e7bee3fd98d5a9ab25cc1295
|
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 58 patches (digest
cae6528aecb5), 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 (f0af66ad), so that the tag is made on the commit this was built from. The tag must point at f0af66ad51f43d3b3a41eb90ce656ee6de57ca09, which release.json names; the launcher's installer checks that.