Six steps. About 30 minutes plus a reboot. Every fix was measured on a real rig, and every one is reversible.
Curious how it works? The idea · Deep detail? Reference · Problems? Troubleshooting
Your 9950X3D2 has V-Cache on both dies, so there's no “good” and “bad” half — the cores are equivalent. Pinning still helps, but for a different reason: keeping the sim on one die avoids the latency cost of reaching across to the other die's cache. Everything below applies; just read “V-Cache die” as “the die you picked”.
Your CPU has two halves: a V-Cache die (games love it) and a frequency die. Stutters happen when Windows lets background work — GPU interrupts, antivirus scans, update tasks — fight the sim for the V-Cache die. The fix: put the sim there, move everything else off, and stop Windows from interrupting. That's all six steps do.
Your whole CPU is one V-Cache die — nothing to pin, which makes this simpler for you. Your stutters come from Windows letting background work — GPU interrupts, antivirus scans, update tasks, a Windows 11 timer quirk — pile onto the cores the sim is using. The fix: stop Windows from interrupting. The steps below skip the core-pinning parts automatically for your chip.
| CPU | V-Cache die (sim goes here) | Frequency die (everything else) |
|---|---|---|
| 9950X3D / 7950X3D | logical cores 0–15 | logical cores 16–31 |
| 9900X3D / 7900X3D | logical cores 0–11 | logical cores 12–23 |
| 9950X3D2 (both dies cached) | logical cores 0–15 | logical cores 16–31 — also cached |
Your chip is a single die — every core shares the V-Cache, so Rules 1 and 2 below don't apply to you (nothing to pin, no die to keep clear). Rules 3 and 4, and every automatic fix, still do.
Rule 1 — EasyAntiCheat blocks hard CPU affinity. Pinning iRacing the forceful way gets reverted seconds after launch. We use CPU Sets (a scheduler hint EAC can't block). The affinity mask still reading 0xFFFFFFFF afterward is normal, not a failure.
Rule 2 — All cores unparked, NOT the Balanced plan. Single-CCD guides recommend Balanced; on a dual-CCD chip with VR, Balanced's core parking strands the VR compositor on a parked die and starves the GPU (measured: ~55% GPU util → 11%, unplayable). Single-CCD chips are the opposite — keep Balanced.
Rule 3 — The Windows 11 focus/timer trap. Windows only honors a game's 1 ms timer while it owns window focus — and the VR compositor steals focus constantly, dropping the timer to 15.6 ms mid-race. Signature: stutters that stop the moment you click the sim window. Step 3 fixes it permanently.
Rule 4 — Measure, don't guess. Change one thing, log a race, compare. The kit's tools do the logging for you.
Adapted for dual-CCD from the single-CCD guide by rcsracing93 — see what flips and why.
In order. Boxes remember themselves, so you can leave and come back — there's a reboot in the middle anyway.
Download the .zip and unzip to a folder you'll keep — e.g. C:\iRacingTuning\. Not Downloads, not the desktop clutter — things reference this folder later.
One free app does the two fixes no script can: Process Lasso (the free version does everything needed).
iRacingSim64DX11.exe shows up in Process Lasso's list. Then you can exit.iRacingSim64DX11.exe → CPU Sets (⚠ not CPU Affinity) → Always → tick cores 0–15.EasyAntiCheat rejects hard affinity — the sim reverts to all cores seconds after launch. CPU Sets are a scheduler hint EAC can't block, and they work just as well.
Optional extras in Process Lasso: put background apps (VR runtime, SimHub, overlays, wheel software, browsers) on the frequency die (cores 16–31), and give iRacing High CPU/I/O/memory priority. Nice-to-haves, not required.
If you use ParkControl (same developer): set Parking = Off and untick “Dynamic Boost” — it flips the power plan mid-race and caused our worst hard freezes.
If you already run Process Lasso, one nice-to-have: right-click iRacingSim64DX11.exe → ProBalance → exclude, so it's never throttled. No CPU Sets, no power-plan change. If you don't have it, don't bother installing it just for this.
In the kit folder, double-click Apply-Baseline.bat. It confirms your CPU, shows a short advisory, then applies every script fix that suits your chip in one window with one admin prompt. Nothing to type.
The fast path — everything in one go.
Prefer one step at a time, with each explained? The guided menu does the same fixes plus troubleshooting tools and undos.
Every fix has an undo: Start-Tuning-Menu.bat → Advanced. Registry, power, and Defender changes only — no drivers, no overclocking.
Each fix is a readable .ps1 in scripts\ (browse them, and see scripts\README.txt). Run one with:
powershell -ExecutionPolicy Bypass -File "path\to\script.ps1"
Setting-changers need an elevated PowerShell (Start → type PowerShell → right-click → Run as administrator). Or run Create-Launchers.ps1 once to get double-click shortcuts that self-elevate. Core numbers are detected automatically from your CPU and checked against the processors Windows reports — there is nothing to edit, however you run the scripts.
The GPU-interrupt and timer fixes only take effect after a restart. Do it now — the boxes will still be ticked when you're back.
What good looks like: tot_dpc and tot_int in the low single digits, gpu_util steady with no collapses, and your power plan unchanged from the first row to the last. The live console keeps every line grey when all of that holds.
hardfaults_s is not the sim. That column counts hard page faults for the whole machine, and a big number there is the single most misleading thing in this CSV. A kernel trace of a real 25-minute session recorded 4,712 hard faults: 1,729 were NTFS metadata, 829 were the Microsoft Store updating apps, 251 Edge Update, 245 Windows Search, 201 the touch keyboard — and 14 were iRacing. Not one texture, not one .dat. So a spike means Windows is busy, not that your storage is too slow; chasing it as sim I/O costs days and fixes nothing. To find out who is really faulting, use Hard faults (Admin) and read the new sim_hardfaults_s, top_fault_proc and top_fault_file columns.12:04:40 → 12:04:42 — was a system-wide stall. Measurement showed that is too strong: the tracer’s own sampling can occasionally overrun its one-second budget on a perfectly healthy machine, and v3.2.0 makes that much rarer. Treat a gap as a lead, not a verdict. It’s a real stall when the rows either side of it back it up — raised tot_dpc/tot_int, a hardfaults_s spike, or gpu_util falling off a cliff. A bare 2-second gap with clean counters on both sides is the logger, not your PC.power_plan — should stay on your unparked plan the whole session (a mid-race flip = ParkControl Dynamic Boost, see Step 2).ccd0_cpu vs ccd1_cpu — CCD0 busier = the sim is on the V-Cache die where it belongs.cpu0_int low, freqcore_int higher — GPU interrupts moved off the sim's core.gpu_util — steady, no collapses to single digits.hardfaults_s — system-wide, not the sim (see the callout above). Bursts during loading are normal. The console goes amber on a single spike over 500/sec and red only after three consecutive seconds above it — a lone spike is ordinary file I/O and never deserved an alert.sim_hardfaults_s, top_fault_proc, top_fault_file — only present after a Hard faults (Admin) run. The first is iRacing's own faults for that second; the other two name whoever faulted most and what they read. This is the column to trust, and it is usually a lot smaller than hardfaults_s beside it.tot_dpc / tot_int — whole-system DPC and interrupt time. Low single digits is healthy; this is what corroborates a suspected stall.gpu_volt_mv — GPU core voltage in millivolts. The number you actually want when testing an undervolt — clocks alone can’t tell you whether a curve is doing anything.gpu_power_w with gpu_gclk — read them together. More MHz at the same watts is what a good undervolt buys you.volt_limit / power_limit / temp_limit — which limiter is holding the card back, shown live as VOLT/PWR/TEMP. Power or temperature limited turns the line yellow.fan_pct / fan_rpm — a lazy fan curve shows up here first, as a slow temperature climb and a sagging clock.pcie_bus_pct — PCIe bus load. Sustained near 100% alongside low vram_used_mb means assets are streaming over the bus instead of sitting in VRAM.Do this only after Step 5 looks clean — that way, if a new stutter appears, you know exactly what caused it.
iRacing rewrites these files on exit, so close the sim first. Files are in Documents\iRacing.
🥽 Your renderer file depends on your headset runtime: rendererDX11OpenXR.ini for most modern headsets, rendererDX11Oculus.ini for the Oculus/Meta runtime, rendererDX11OpenVR.ini for SteamVR. Not sure? Sort the folder by date modified after a VR session — the one iRacing just touched is yours.
| File | Set | Why |
|---|---|---|
rendererDX11.inirendererDX11OpenXR.ini (or your runtime's — see above) | LoadTexturesWhenDriving=0 | Preload textures instead of streaming off disk mid-lap ⚠ breaks Trading Paints — see the note below |
rendererDX11.inirendererDX11OpenXR.ini (same file) | CacheSwap3HighResCars=0 | No mid-race texture swapping ⚠ same |
rendererDX11.inirendererDX11OpenXR.ini (same file) | CrowdDetail=0 | Fewer draw calls, near-zero visual impact. Lives in the renderer ini (also exposed under Graphics options in-sim) |
app.ini | spoolingEnabled=0 | Stops continuous replay-to-disk writes |
⚠ Use Trading Paints? Read this before setting those first two.
Trading Paints doesn't pre-load anything. It fetches each opponent's livery while you're in the session and asks iRacing to reload that car's texture. Those two settings tell iRacing not to load textures while you're driving — so any paint that arrives after you roll out never gets applied, and that car stays white for the whole session.
You get to pick one:
LoadTexturesWhenDriving=1 and CacheSwap3HighResCars=1. You give back a little of the mid-lap streaming benefit. Everything else in this guide still applies, and it's a small part of the total gain.0 and accept white cars, or race with Trading Paints Downloader closed so you're not waiting on downloads at all.Trading Paints documents this themselves: if cars stay white and never reload, LoadTexturesWhenDriving is the setting they tell you to change. It's a real trade-off, not a bug in either tool.
| Setting | Value |
|---|---|
| Low Latency Mode | On — not Ultra (Ultra caused present-queue stalls) |
| Power Management | Prefer Maximum Performance |
| Vertical Sync | Off |
| Threaded Optimization | On |
| Shader Cache Size | Unlimited |
| Anisotropic Filtering | Your call. 16x is reported to cause issues, so the safe default is Application-controlled — but on my rig forcing 16x gives a noticeably sharper image in VR. Look at the graffiti on the tarmac at the Nürburgring: once with application-controlled, once with 16x forced. Try both and keep what looks better to you. |
Also disable the GeForce/NVIDIA App in-game overlay — DirectX hooks and DPC load for no benefit. Same goes for RTSS / MSI Afterburner: notorious stutter sources, close them unless you truly need them.
usoclient.exe; an xperf HARD_FAULTS trace then found the Microsoft Store's app auto-update was the largest single non-kernel source of hard faults in a real session. Run Check-Quiet-Status after quieting — it now fails a machine unless every task is off, and names any that aren't.
Match your symptom. Every tool below is in Start-Tuning-Menu.bat → Troubleshoot.
The focus/timer trap. Run Watch-TimerResolution: if the timer jumps from ~1 ms to ~15.6 ms when the sim loses focus, the timer fix isn't active — re-run it from the menu (Advanced) and reboot.
Scheduled-task cadence (Windows Update scans fire every ~5–7 min). Run FullTrace during a race, then Scan-Stutter-Events — it finds each candidate in your trace and lists which task fired at that moment. The Each-Race routine silences the usual offenders.
Check the candidates before chasing them. A gap with a hardfaults_s spike or raised tot_dpc beside it is worth pursuing; one with clean counters either side and no scheduled task nearby is most likely the tracer’s own sampling, not a stutter. Repeated pagefault spikes under green flag, with free RAM steady, point at something touching disk mid-race rather than at memory pressure.
Step 6 is the cause, specifically LoadTexturesWhenDriving=0 and CacheSwap3HighResCars=0.
Trading Paints downloads each opponent's livery during the session and asks iRacing to reload that car. Those settings stop iRacing loading textures while you drive, so anything that arrives late stays white — which is why you see more white cars rather than all of them. Paints that landed before the session finished loading are fine.
Fix: close the sim completely, then in Documents\iRacing set both back to 1:
LoadTexturesWhenDriving=1CacheSwap3HighResCars=1
🥽 In VR that's your runtime's renderer file — rendererDX11OpenXR.ini, rendererDX11Oculus.ini or rendererDX11OpenVR.ini. Sort by date modified after a session; the one iRacing just touched is yours.
The file is rendererDX11.ini.
iRacing rewrites these on exit, so it must be closed while you edit.
Nothing in the script kit affects Trading Paints — the pre-race quieting doesn't touch it, and Defender exclusions only ever add permissions. If white cars persist with both settings at 1, it's a Trading Paints issue rather than anything here: check the Downloader is actually running, and that your firewall and antivirus allow it.
You ran the Each-Race routine, and part way through a session the update services come back — usually about ten minutes in, with a stutter as they do. Stopping a service isn't enough on its own: Windows Update Medic exists specifically to detect a tampered update stack and repair it.
Find out what did it. From an elevated PowerShell:
scripts\Trace-QuietReverts.ps1
It reads the Windows event logs that record a service being re-enabled — including Service Control Manager event 7040, the definitive record — and lays them out as a timeline. Run it elevated or the Medic tasks are invisible and will look absent when they aren't.
Two possible answers:
-NoUnlock to skip it.gpresult /h gp.html.Usually a driver's DPC latency. Run LatencyMon (free) while racing — it names the driver behind the spike. nvlddmkm.sys on CPU 0 means the GPU-interrupt fix reverted (an MSI-mode quirk) — re-run it from the menu and reboot. Also close RTSS/Afterburner while diagnosing.
Still stuck? Set-NIC-USB-IRQ-Affinity (menu → Advanced) steers network + USB interrupts off CPU 0 too — the same trick as the GPU fix, worth trying when something remains.
Your Windows performance counters are corrupt (surprisingly common). Menu → Advanced → Repair-PerfCounters, reboot, re-trace.
Menu → Advanced has an undo for every fix (GPU IRQ, NIC/USB, timer, guide extras). Power plan and Process Lasso changes are reverted in their own apps. Post-Race-Restore turns Update/Search/Defender back on. Reboot after undoing IRQ or timer changes.
Diagnostics (read-only): FullTrace (1 Hz CSV, 39 columns: per-CCD load, CPU0 vs frequency-core interrupt/DPC, GPU util/power/clocks/throttle plus core voltage, fan, VRAM, PCIe load, P-state and the active limiter flags, sim & VR CPU, pagefaults, free RAM, power plan — colour-coded live, and timestamp gaps flagged for corroboration rather than taken as proof of a stall). Afterburner-sourced sensors need MSI Afterburner running; anything unavailable stays blank. Then Preflight-Check, Scan-Stutter-Events, Watch-TimerResolution.
Fixes (each reversible): Enable-GlobalTimerResolution (GlobalTimerResolutionRequests=1 under HKLM\...\Session Manager\kernel), Set-GPU-IRQ-Affinity (DevicePolicy=4 + AssignmentSetOverride on the display adapter — NVIDIA, AMD or Intel), Set-NIC-USB-IRQ-Affinity (same, PCI NICs + USB hosts, spread over cores 17–19), Add-Defender-Exclusions, Apply-Guide-Extras (USB suspend, Game Bar/DVR), Pre-Race-Quiet / Post-Race-Restore (Update/Search tasks + services, optional Defender realtime — needs Tamper Protection off), Repair-PerfCounters (lodctr /R both arches + WMIADAP), Enable-DiagnosticLogs.
HAGS (Hardware-Accelerated GPU Scheduling) is deliberately not scripted — it's a genuine toss-up on newer cards. Test both ways.
Full inventory with admin flags: scripts\README.txt · browse the source.
Adapted from rcsracing93's excellent single-CCD guide. Most of it transfers; two things flip on dual-CCD:
This guide supports single-CCD chips too — pick 7800X3D / 9800X3D at the top and it hides the pinning steps, keeps you on Balanced, and still applies the timer, GPU-interrupt, Defender and background fixes.