lucannez64andClaude Opus 5.5 4370f375cd Cut Darling overhead in League fights and add passive match capture
Game process (ARAM Hexgate: 84 -> 127 FPS average, slowest stretches ~110):
- Local pthread mutexes, condition variables and Mach semaphores are on by
  default in the game process only, with /tmp/rclol-no-local-* opt-outs.
  The main thread's darlingserver waits fell from 1.36 to 0.10 ms per frame.
- Local semaphores: the count and the slot generation change in one
  compare-exchange, a destroy leaves a negative marker, the table is reset
  after fork, and names the table did not create go to the server.
- Metal: drop identical re-binds (keyed on the Indium object, depth-stencil
  retained), pass blit resources by reference, and stop resetting vertex
  descriptors twice.
- Core isolation of the main thread is opt-in (/tmp/rclol-core-isolation);
  it lowered FPS in its only match.
- Optimized libc/libc++/Foundation overlays, AVX2 string primitives, real CPU
  topology and their installers and offline checks.

Tools and docs:
- tools/riot-match-capture: passive /proc sampler, user-space IP profiler and
  reports, plus a comparison against the game's netstats.
- tools/riot-lsem-model and tools/riot-metal-bind-model: host models that
  extract the shipped code and check it.
- tools/install-riot-metal-pair.sh installs Metal and Indium together.
- Status, setup, testing and troubleshooting docs updated with the measured
  matches and the switch table; manifest file counts match the patches.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 16:48:34 +02:00

darling-lol

Experimental source patches and tools for running the macOS League of Legends client on x86-64 Linux through Darling.

This is a development snapshot, not a finished launcher. Riot and League clients can launch and manually played ARAM games have run. Graphics, audio, input, startup crashes and memory reclamation have received compatibility fixes. On the Ryzen 5 5500 / RX 6600 PC, reported fight FPS was 70–80 versus 170–190 on Windows. The latest server and memory changes have native regression coverage, but their effect on game FPS and client RAM remains unmeasured. A fresh checkout has not been validated end to end on another machine.

Included

  • Pinned upstream revisions and patches for 29 Darling components, including Metal/Indium, AppKit, QuartzCore, CoreAudio, the kernel shim and darlingserver.
  • Event-poll presentation and GPU synchronization fixes, floating-point-safe GL resolvers, multi-window presentation and nullable LaunchServices error handling.
  • Reusable server receive buffers and Darwin allocator hints translated to Linux lazy reclamation.
  • Build/install/launch wrappers, atomic incremental installers and standalone regression probes.
  • Historical experiments in tools/ and research/tools/, explicitly excluded from the normal workflow where they automate or inspect the client/game.

Game files, Riot installers, account databases, tokens, local prefixes, captures and compiled binaries are not included. Install the game manually through Riot. The normal launcher does not enable an Electron inspector or start UI automation helpers. Existing runtime compatibility shims remain part of this experimental setup; this is not a claim of approval by Riot.

Requirements

  • x86-64 Linux 5.14 or newer, an X11 session or Xwayland, and a working hardware Vulkan/OpenGL driver. AMD RADV has been exercised; other drivers are not validated.
  • Git + Git LFS, Bash, curl, unzip, CMake, Make, Clang/LLD, LLVM development files, a C/C++ compiler, Python 3.12+ and the Darling build dependencies. The patch includes LLVM 22/23 branch-opcode compatibility; the new PC used LLVM/Clang 23. Node.js is needed only for the offline JavaScript checks.
  • libvpx development files and X11/XCB/SHM development files for the current runtime helpers.
  • Enough free disk for Darling sources/build, Git LFS assets and the game: budget at least 50 GB. Building is substantially larger than this source-only repository.

Use the dependency list in the pinned Darling source for your distribution. tools/env-check.sh provides a starting check; its legacy package names may need adapting to your distro.

Build on the other PC

git clone https://github.com/lucannez64/darling-lol.git
cd darling-lol
python3 -m venv build/venv
build/venv/bin/pip install -r requirements.txt
python3 scripts/configure.py --guest-user "$USER"
./scripts/build.sh
sudo cmake --install build/darling-src/build
./scripts/install-runtime.sh

The default layout is /usr/local/libexec/darling, ~/.darling and /Users/$USER inside the guest. Use the actual guest account name if it differs. Paths are rendered into ignored files under build/runtime/tools; do not run the tokenized tools/ templates directly. See setup details.

The install wrapper compiles the paired runtime, shuts down Darling before replacing per-user overrides, and backs up relevant files. Do this with no Riot/League session running.

Install and launch Riot

After the runtime is installed:

./scripts/installer.sh euw

Sign in and install League through Riot's own UI. For subsequent launches:

./scripts/run.sh

First installation and future Riot updates can still encounter compatibility gaps. An accepted Install action can fail native LaunchAgent registration and leave the download idle. The archived inspector-based workaround and Electron visibility binary patch are excluded from the manual workflow. See troubleshooting for the known limitation and fixes that are in the runtime.

For another region, set RCLOL_REGION and RCLOL_LOCALE before launch. For example RCLOL_REGION=NA RCLOL_LOCALE=en_US ./scripts/run.sh. Linux display selection follows $DISPLAY; the legacy launcher fallback is :1.

Testing

Start with standalone regression checks, then play a match manually. See testing. Do not attach a debugger, query client APIs, inject diagnostic hooks or automate client/game input. Legacy practice, profiling and inspector helpers are retained as historical source, not recommended launch or testing steps.

FPS counters, game presentation requests and physical display refresh are different measurements. Record average and p99 frame times, the active scene, graphics settings, charger/power state and whether the game stayed focused. See current status.

On the Ryzen 5 5500 / RX 6600 test PC, ARAM on Hexgate went from 84 to 127 FPS average over 2026-10-13/14, with the slowest 10-second stretches around 110 (status). The game-process speed switches and their opt-out files are listed in setup, and passive match capture is described in testing.

For existing installations, incremental update instructions explain the server and memory installers, user-owned backups and the full Darling restart needed to activate replacements. Perform activation only after manually exiting the game and both clients.

Layout

scripts/             portable entry points
upstream/manifest.json  exact base revisions and patch ownership
patches/             current source changes, one patch per repository
tools/               runtime templates, regression probes and legacy helpers
research/tools/      historical experiments, not a supported workflow
docs/                setup, testing, status and licensing notes
build/               local sources, outputs and rendered tools (ignored)

Darling/upstream components retain their existing licenses; see third-party notes. Original integration tooling is distributed under GPL-3.0; patches retain the licensing of their target files. This project is not affiliated with Riot Games.

S
Description
No description provided
Readme GPL-3.0
5.2 MiB
0 Stars 1 Watchers 0 Forks
Languages
Python 52%
C 21.9%
C++ 10.2%
Objective-C 5.5%
Objective-C++ 5%
Other 5.4%