#373

CPU heavy game has severe translation bottleneck (Sid Meier’s Civilization VI)

OpenNotboodopened 13d ago

Summary Civilization VI (Steam, Win64Steam, DX11) runs without crashes or graphical issues, but sits at about 12-13 FPS even in the first ten turns at 1600x900 with mid-to-low graphics. It is much slower than PEAK and Cyberpunk 2077 on the same device, even though it is an older game with no advanced rendering. It also takes about 3 minutes to reach the main menu. Lowering resolution and graphics does not help, so it looks CPU/translation-bound, not GPU-bound.

Environment

  • iPad Pro M5 (iPad17,1), iPadOS 27.2 beta 2, 9 cores, 11.5 GB RAM
  • Madeira v0.1.3 (4), JIT via StikDebug
  • JIT pool 1024 MB requested, Fastsync

Sync mode comparison

  • Fastsync: fastest start and highest in-game FPS
  • Wine standard sync: slightly slower
  • Madsync: the game does not start at all

Findings from the attached log (launch with Run through processing one turn, ~11 min)

  1. JIT pool is silently capped. The requested 1024 MB is shrunk to 560 MB: no hole fits a 1024MB pool — SHRINKING to 560MB. So raising the pool setting has no effect here.
  2. The main game thread is CPU-bound. In-game it runs near 100% of one fast core at ~4.1 GHz (IPC ~2). Processing a turn bursts to roughly 3+ cores for a second or two.
  3. Very high x64 -> ARM64EC transition rate. [xp-api] reports up to ~6.3M transitions/s (18:12:51), ~2.3M/s (18:08:15) and ~1.8M/s (18:14:25). The hottest sampled addresses are small ucrtbase.dll functions (e.g. ucrtbase.dll+0x61610, +0x62508). This may be why a CPU-heavy game suffers while GPU-heavy games do not.
  4. A thread appears to spin. The final [thread-sample] burst shows one thread at 98-100% RUN, in the same tight loop (pc 0x14e4619cc / 0x14e4619e0) across three consecutive samples, with EOSSDK-Win64-Shipping.dll+0x4ea0a0 as a stack candidate (Epic Online Services SDK, bundled with Civ VI).
  5. Sync is not the bottleneck. Critical-section contention stays at 0-32/s with ~0.4 ms/s of waiting.
  6. Boot phase. For about 3 minutes (10-180 s after launch), roughly three fast cores stay pegged with unusually high IPC (~6).
  7. Memory footprint peaked at ~8.2 GB.

Questions

  • Can the JIT pool be placed so that more than 560 MB fits?
  • Is the cost of x64 -> EC transitions for small CRT calls reducible?
  • Is the EOSSDK spin loop a known issue?
  • The in-app perf overlay shows only ~3% CPU / ~10% GPU at 12-13 FPS, which does not match the log telemetry. Does the overlay measure something different?

Full civ-6 run log attached from starting the game in windows Run to processing a turn (madeira-log.txt): madeira-log.txt

This issue is partially written with the assist of Claude

Activity

0

No activity yet.