TL;DR: Run8 is a .NET Framework app. Under Proton it runs on wine-mono by default, which caps the game thread, and Wine's file lookup on btrfs/ext4 turns Run8's thousands of "does this optional file exist?" checks into full directory scans. Two changes fix both: (1) real .NET Framework 4.8 in a dedicated prefix, (2) the Content folder on a small f2fs image with casefold (case-insensitive, hashed directories).
Measured on a Ryzen 9 7900X3D / RX 7900 XT (RADV), world "SouthernCA, 11 routes, 213 trains":
| Setup | Route DBs | Nearby Scenery | Trains | Total load | GPU busy |
|---|---|---|---|---|---|
| Default (wine-mono, btrfs) | 75 s | 45 s | 24 s | 152 s | 44 % (≈60 fps cap) |
| + .NET 4.8 | 74 s | 15 s | 22 s | 116 s | 73 % |