1 comments

  • minasierra an hour ago

    I think this is one of the biggest issues with gaming on Mac: Games with Easy Anti-Cheat (EAC) often don't run on Mac or don't support online matchmaking / gaming. CrossOver and Wine are already great software to run the game itself, but EAC also checks the hardware and OS it runs on, which is why Anti-Cheat protected games don't run on Mac.

    A friend and I wrote a paper on a solution with practical testing: run a Linux-based system (in this case Valve's SteamOS) inside a Mac VM / app, to use Steam's Proton (which is a fork of Wine made for Linux that can run Anti-Cheat protected games) to let EAC run on Linux.

    With this, we already got a few games that are Easy Anti-Cheat protected running on macOS / Apple Silicon, including online matchmaking and online play! The Good Part: Nothing is hidden. EAC was not modified and can see the virtual machine and it accepted that setup anyway.

    Some caveats: - It only works for games whose developers have enabled EAC's Proton / Linux support - The first load of game assets is really slow because of Metal shader compilation (40s-50s cold, works afterwards when content is cached) - Epic Games / EAC don't officially support emulation / VMs

    For the curious:

    I really recommend checking out the linked paper below, but as a quick sum up: EAC's Linux client is x86-64 only, and its launcher injects it into the game using ptrace, a Linux debugging feature. So translating the CPU instructions isn't enough: the emulator (FEX-Emu) also has to reproduce Linux process tracing and signal behavior faithfully. At first it didn't, and EAC failed to start. It looked like EAC had detected the emulator, but the emulator was just getting Linux details wrong.

    On the GPU side, Direct3D goes to Vulkan inside the VM, then to Metal on the Mac. The main bottleneck is shader compilation, which causes the long first load and occasional freezes. A persistent cache on the Mac helps on repeat loads.

    The paper also covers CPU overhead, input latency and what didn't work.

    I tried to keep this as short as possible. Everything else is mentioned in the paper ^^

    Any questions, feedback or corrections are welcome! Find us on Discord: minasierra or com.nzlinix