00Start Here — Diagnostic Decision TreeFIRST STEP
Before changing any settings, capture your frame times with CapFrameX and identify which type of stutter you have. The fixes are different and applying the wrong one wastes time.
Do you have stutters in iRacing?
→Yes, it feels like a brief freeze or hitch → Install CapFrameX and capture a session first (Section 01)
→Not sure if it's a stutter or normal corner-specific slowdown → Check if it happens at the same corner every lap. If yes, capture it. If random, go to Section 01.
In your CapFrameX capture, look at the spike frame. What do you see?
→Frame BEFORE the spike has GPU active time 20ms+, spike frame CPU is low (~3ms) → Type A — GPU scene complexity. Go to Section 02.
→Spike frame CPU is 15–30ms, GPU is fine (~3–4ms), no preceding frame anomaly → Type B — CPU sim thread preemption. Go to Sections 03, 04, 05.
→Both CPU and GPU are fine on the spike frame (~3–5ms each), no preceding anomaly → Present queue stall — likely NVIDIA DPC or overlay interference. Go to Sections 03D and 05.
→Hard pagefaults over 10,000 in LatencyMon → Background services running. Go to Section 04.
LatencyMon — where are your interrupts going?
→CPU 0 DPC total is over 15s per 5 minutes, all other CPUs near zero → NVIDIA interrupt affinity problem. Go to Section 05.
→Top pagefaulting process is tiworker.exe or wuauserv → Windows Update running during session. Go to Section 04.
→Top pagefaulting process is rtss.exe or capframex.exe → RivaTuner Statistics Server interference. Go to Section 03D.
→Top pagefaulting process is msmpeng.exe → Windows Defender scanning iRacing. Go to Section 04.
ℹMost systems have multiple problems simultaneously. Fix them in order: graphics settings first (quickest), then services, then NVIDIA interrupt affinity (most complex). The interrupt affinity fix alone won't help if you're also running Windows Update mid-session.
01Setting Up Your Diagnostic ToolsDIAGNOSIS
CapFrameX — Frame Time Capture
Download free from capframex.com. This captures precise frame times for every frame and lets you identify spike patterns in the data.
Configure capture settings — in CapFrameX settings, set capture duration to 300 seconds (5 minutes). This gives enough data to catch intermittent spikes.
Disable the RTSS overlay — in CapFrameX → Options → Overlay, uncheck "Show overlay." RivaTuner Statistics Server (which powers the overlay) adds 50,000+ hard pagefaults per session and can cause its own stutters. The JSON capture works fine without the overlay.
Uninstall RTSS and MSI Afterburner if present — even with the overlay disabled, RTSS hooks into DirectX and causes background interference. Settings → Apps → uninstall both. CapFrameX capture works without them.
In iRacing, complete at least one full lap before starting capture — the first 30–60 seconds of a session include initialization noise. Start your capture after the first corner sequence to get clean data.
After the session, upload the JSON file here or open it in CapFrameX to view frame times. Look for frames over 12ms (at a 164fps cap, target is 6.1ms — anything over 2× target is a spike you'd feel).
LatencyMon — Kernel Interrupt Analysis
Download free from resplendence.com/latencymon. This identifies which Windows kernel drivers are causing DPC interrupt stalls.
Run LatencyMon as Administrator while iRacing is running. Alt-Tab out of iRacing, start LatencyMon, click Play.
Drive for at least 5 minutes through your problem corners with LatencyMon running in the background. Less than 2 minutes gives unreliable results.
Check the Drivers tab sorted by "Highest DPC execution time" — the top entry is your primary offender. On NVIDIA systems this is usually nvlddmkm.sys or dxgkrnl.sys.
Check Per CPU data — if CPU 0 shows 10× more DPC work than all other cores combined, you have an interrupt affinity problem (Section 05).
Check hard pagefaults — over 5,000 total per session is elevated. Over 20,000 indicates a background service running. Check which process is listed as the top pagefaulter.
Reading LatencyMon results
| Finding | Meaning | Action |
| nvlddmkm.sys highest DPC | NVIDIA kernel driver DPC too long | Section 05 — interrupt affinity |
| dxgkrnl.sys highest DPC | DirectX kernel — often follows NVIDIA fix or overlay hooks | Section 03D — remove RTSS/overlays |
| CPU 0 dominates ISR/DPC | All interrupts on iRacing's core | Section 05 — interrupt affinity |
| tiworker.exe pagefaults | Windows Update running mid-session | Section 04 — disable services |
| msmpeng.exe pagefaults | Defender scanning iRacing files | Section 04 — add exclusions |
| rtss.exe pagefaults | RivaTuner Statistics Server | Section 03D — uninstall RTSS |
| iracingui.exe pagefaults | iRacing UI browser open during session | Close the iRacing launcher during racing |
02Fix A — GPU Scene Complexity SpikesTYPE A
These spikes happen at visually complex corners — grandstands, catch fencing, pit entry, bridges. The GPU gets handed more draw calls than it can complete in one frame, causing the following frame to stall waiting for it to finish.
How to identify Type A
GPU Burst Pattern
Frame −1 GPU active28–35ms
Spike frame FT25–32ms
Spike frame CPU~3ms ✓ fine
Spike frame GPU~4ms ✓ fine
Ripple4–5 elevated frames
PatternSame corner every lap
What causes it
Root Causes
High MSAA samples4x default
Crowds enabledmany draw calls
Car texture streamingGPU burst on entry
Shadow maps onexpensive at corners
Refresh rate mismatchpresent timing off
iRSidekick / iRacing Graphics Settings
| Setting | Value | Reason |
| Refresh Rate | Monitor maximum Hz | Running below max (e.g. 120Hz on a 240Hz monitor) causes present timing mismatches with your frame cap. Set to actual monitor max. |
| NVidia Reflex | Off | Reflex On+Boost manipulates the present queue and caused stall patterns in testing. Start with Off. |
| Frame Rate Limit | Monitor Hz − 1 | 164fps for 165Hz, 239fps for 240Hz. Leave ~30% GPU headroom so burst corners don't max out the card. |
| MSAA Samples | 2x | Dropping from 4x to 2x significantly reduces GPU draw call load at complex geometry. Biggest single graphics fix. |
| Crowds | Off | Grandstand crowd geometry is a major draw call source. Off has near-zero visual impact at racing speeds. |
| Shadow Maps & Cloud Shadows | Off (unchecked) | Biggest GPU spike contributor at complex scenes. Turn off first when chasing Type A. |
| Dynamic Objects | Off | |
| Static Shadow Count | 2 | Default is 3. Drop to 2 if spikes persist after other changes. |
| Max Prerendered Frames | 1 | Reduces render queue depth and input latency. |
| Video mem swap high-res cars | Unchecked | Found in Extras tab. This allows dynamic car texture streaming which causes GPU bursts when cars enter view. Uncheck to preload everything at session start. |
app.ini Texture Preloading
Location: Documents\iRacing\app.ini — back up before editing. iRSidekick does not manage these keys so they persist through profile changes.
Add or edit under the [Graphics] section:
app.ini — [Graphics] sectionCopy
carPreloadAll=1 ; Preload all car textures at session start
trackTexturePreload=1 ; Preload track assets at session start
streamingTextureSize=256 ; Reduce burst size for any remaining streaming
Under the [Audio] section:
numSoundStreams=12 ; Cap audio threads (default -1 = unlimited)
ℹSession load time will increase with preloading enabled. This is correct — assets load once at session start rather than mid-lap. Wait for the full loading screen before going on track.
03Fix B — CPU Sim Thread PreemptionTYPE B
iRacing's sim thread is hardcoded to run on CPU 0. When any kernel interrupt (DPC) also fires on CPU 0, it preempts the sim thread and causes a stutter. The GPU is completely idle during these events — it's purely a CPU scheduling problem.
How to identify Type B
CPU Preemption Pattern
Frame −1 GPU active~4ms ✓ normal
Spike frame FT15–27ms
Spike frame CPU15–27ms
Spike frame GPU~3ms ✓ fine
Ripple1 frame, clean recovery
PatternRandom corners, no pattern
Root causes
What preempts CPU 0
NVIDIA DPC interruptsdefault on CPU 0
Windows Updaterestarts mid-session
RTSS / GFE hooksDirectX interference
Defender scanningmid-session pagefaults
Background servicesWSearch, SysMain etc
NVIDIA Driver — Install Correctly
Download latest Game Ready Driver from nvidia.com/drivers. Significant present queue management improvements have been made in recent driver releases. Old drivers can cause present stalls.
Run Custom Install — uncheck everything except Display Driver. Specifically uncheck: GeForce Experience, PhysX System Software, NVIDIA App, HD Audio (unless using HDMI audio output). Each of these adds background processes and DirectX hooks.
NVIDIA Control Panel — Program Settings
Manage 3D Settings → Program Settings → Add iRacingSim64DX11.exe
| Setting | Value | Notes |
| Power Management Mode | Prefer Maximum Performance | Prevents GPU clock stepping during session. |
| Low Latency Mode | Ultra | Reduces render queue depth, helps with present timing. |
| Threaded Optimization | On | Distributes NVIDIA driver work across multiple cores rather than concentrating on CPU 0. |
| Texture Filtering Quality | High Performance | Reduces texture filtering overhead. |
| Vertical Sync | Off | iRacing handles its own frame pacing via the in-game cap. |
| Shader Cache Size | Unlimited | Prevents shader recompilation mid-session. |
Remove GeForce Experience and RTSS
⚠RivaTuner Statistics Server (RTSS) was found to cause 50,000+ hard pagefaults per session and peak NVIDIA DPC times of 2,900µs+. It hooks into the DirectX present chain. If you have MSI Afterburner or any overlay tool that uses RTSS, uninstall both. CapFrameX JSON capture works without RTSS — disable the overlay in CapFrameX settings (Options → Overlay → uncheck Show overlay).
⚠GeForce Experience runs nvcontainer.exe as a background process that hooks into DirectX and generates unnecessary DPC interrupts. If you use it only for driver downloads, uninstall it — download drivers directly from nvidia.com instead.
Uninstall via Windows Settings → Apps:
- RivaTuner Statistics Server
- MSI Afterburner (installs RTSS as a dependency)
- NVIDIA GeForce Experience
04Fix C — Background Services & PagefaultsHIGH IMPACT
Windows background services — particularly Windows Update — restart themselves mid-session even after being stopped. The fix is to disable them (not just stop them) before racing, then re-enable after.
⚠Stopping services with sc stop is not enough — wuauserv, UsoSvc, and WSearch restart automatically. Use sc config start= disabled to prevent this.
Services to Disable Before Racing
Run as Administrator in Command Prompt — before racingCopy
:: DISABLE these so they cannot restart mid-session
sc config wuauserv start= disabled
sc stop wuauserv
sc config UsoSvc start= disabled
sc stop UsoSvc
sc config WSearch start= disabled
sc stop WSearch
:: STOP these (they stay stopped without disabling)
sc stop SysMain
sc stop Spooler
sc stop WlanSvc
sc stop BthAvctpSvc
sc stop BTAGService
sc stop bthserv
sc stop XblAuthManager
Re-enable After Your Session
Run as Administrator — after racingCopy
:: Re-enable disabled services
sc config wuauserv start= auto
sc start wuauserv
sc config UsoSvc start= auto
sc start UsoSvc
sc config WSearch start= delayed-auto
sc start WSearch
:: Restart stopped services
sc start SysMain
sc start Spooler
sc start WlanSvc
sc start bthserv
sc start BthAvctpSvc
sc start BTAGService
sc start XblAuthManager
Windows Defender Exclusions
Run in admin PowerShell — prevents Defender from scanning iRacing files during sessions:
Run in Administrator PowerShellCopy
Add-MpPreference -ExclusionPath "C:\Program Files (x86)\iRacing"
Add-MpPreference -ExclusionPath "$env:USERPROFILE\Documents\iRacing"
✓Expected result: Hard pagefaults drop from 70,000+ per session to under 2,000. LatencyMon should no longer show tiworker.exe or msmpeng.exe as top pagefaulters.
05Fix D — NVIDIA Interrupt AffinityCOMPLEX — TYPE B
By default, NVIDIA's kernel driver (nvlddmkm.sys) services all GPU interrupts on CPU 0 — the same core iRacing's sim thread is hardcoded to. Moving NVIDIA interrupts to a different core eliminates this competition.
⚠Windows 11 limitation: Modern NVIDIA GPUs use MSI (Message Signaled Interrupts) mode, not MSI-X. Windows 11 client editions do not reliably honor interrupt affinity settings for MSI devices. Results vary — this works consistently on some systems and inconsistently on others. Windows 10 users typically have better results. Still worth attempting as the potential gain is significant.
🔧Device-specific values ahead. The GPU Device ID and device instance identifiers in this section are unique to each computer. You must find your own values using the commands provided — do not copy the example values.
Step 1 — Find Your GPU Device ID
Run in Command Prompt:
Find NVIDIA device ID — copy your own outputCopy
wmic path Win32_PnPEntity where "Name like '%NVIDIA%'" get DeviceID,Name
Look for your GPU model (e.g. RTX 4090, RTX 3080). The DeviceID looks like:
Example output — your values will be different:
PCI\VEN_10DE&DEV_XXXX&SUBSYS_XXXXXXXX&REV_XX\4&XXXXXXXX&0&XXXX
🔧Important: There may be multiple device instances (2–3) for the same GPU. Windows alternates between them on each reboot. You must apply the affinity setting to all instances — use GoInterruptPolicy (Step 3) to identify each one, or apply the registry fix to all instances you find.
Step 2 — Apply via Registry (all instances)
For each device instance, run these three commands in admin cmd. Replace YOUR_DEVICE_ID with each full ID from Step 1 including the instance suffix (e.g. 4&1babdf5b&0&0009):
Registry fix — replace YOUR_DEVICE_ID with your valueCopy
:: Run for EACH device instance found in Step 1
reg add "HKLM\System\CurrentControlSet\Enum\PCI\YOUR_DEVICE_ID\Device Parameters\Interrupt Management\Affinity Policy" /v DevicePolicy /t REG_DWORD /d 4 /f
reg add "HKLM\System\CurrentControlSet\Enum\PCI\YOUR_DEVICE_ID\Device Parameters\Interrupt Management\Affinity Policy" /v AssignmentSetOverride /t REG_BINARY /d 10 /f
reg add "HKLM\System\CurrentControlSet\Enum\PCI\YOUR_DEVICE_ID\Device Parameters\Interrupt Management\Affinity Policy" /v DevicePriority /t REG_DWORD /d 3 /f
Key values explained:
- DevicePolicy = 4 — IrqPolicySpecifiedProcessors (use the core we specify)
- AssignmentSetOverride = 10 (hex) — bitmask for logical CPU 4 (binary 00010000). CPU 4 = first thread of physical core 2 on most 8-core Ryzen CPUs
- DevicePriority = 3 — High interrupt priority
Reboot after applying. Verify with LatencyMon — CPU 4 should now show elevated DPC activity.
Step 3 — GoInterruptPolicy (alternative / supplement)
Download from github.com/spddl/GoInterruptPolicy. Run as Administrator. Search "nvidia" to filter the list.
Find all NVIDIA GeForce RTX entries. Check the DevObj Name column to identify which is on PCI bus 2 (the active instance on this boot). There will be multiple.
For each NVIDIA GPU entry, set: Device Priority → High, Device Policy → IrqPolicySpecifiedProcessors, then check Thread 4 only (uncheck everything else).
Apply the registry fix (Step 2) in addition to GoInterruptPolicy — the registry fix covers whichever instance Windows picks up on the next reboot. GoInterruptPolicy covers the currently active one.
Automate with Pre-Launch Script
Since the active device instance changes each reboot, the most reliable approach is to re-apply the registry fix before every session via the pre-launch script (Section 08). This ensures all instances are set regardless of which one Windows activates.
Verify It's Working
Run LatencyMon during iRacing. In Per CPU Data:
- Working: CPU 4 shows 40–50s DPC total, CPU 0 drops to 10–15s
- Not working: CPU 0 still dominant (40s+), CPU 4 near zero
To Revert
Revert — replace YOUR_DEVICE_IDCopy
reg delete "HKLM\System\CurrentControlSet\Enum\PCI\YOUR_DEVICE_ID\Device Parameters\Interrupt Management\Affinity Policy" /f
06Fix E — AMD Ryzen Balanced Power PlanX3D SPECIFIC
The 7800X3D and 9800X3D use 3D V-Cache technology that requires the CPU firmware to dynamically prioritize specific cores for gaming workloads. The AMD Ryzen Balanced power plan enables this. Bitsum Highest Performance and Windows High Performance both disable AMD's core prioritization.
⚠Despite AMD chipset drivers being installed, the Ryzen Balanced power plan is frequently missing from Windows. Check with powercfg /list in cmd. If it doesn't appear, create it manually below.
Check if AMD Ryzen Balanced existsCopy
powercfg /list
If "AMD Ryzen Balanced" doesn't appear in the list, create it manually:
Create AMD Ryzen Balanced — run as AdministratorCopy
:: Step 1 — duplicate the Balanced plan, note the GUID it outputs
powercfg /duplicatescheme 381b4222-f694-41f0-9685-ff5bb260df2e
:: Step 2 — configure it (replace YOUR-GUID with the output from Step 1)
powercfg /changename YOUR-GUID "AMD Ryzen Balanced"
powercfg /setacvalueindex YOUR-GUID 54533251-82be-4824-96c1-47b60b740d00 893dee8e-2bef-41e0-89c6-b55d0929964c 5
powercfg /setacvalueindex YOUR-GUID 54533251-82be-4824-96c1-47b60b740d00 bc5038f7-23e0-4960-96da-33abaf5935ec 100
powercfg /setacvalueindex YOUR-GUID 54533251-82be-4824-96c1-47b60b740d00 7f2f5cfa-f10c-4823-b5e1-e93ae85f46b5 1
:: Step 3 — activate it (replace YOUR-GUID)
powercfg /setactive YOUR-GUID
:: Step 4 — save your GUID — you'll need it for the pre-launch script
powercfg /list
🔧The GUID generated will be unique to your system. Save it — you'll need it in the pre-launch script (Section 08) and if you ever reimage.
07Fix F — Process Lasso ConfigurationTYPE B
⚠Do NOT set CPU affinity for iRacingSim64DX11.exe. iRacing uses EasyAntiCheat which blocks all external CPU affinity changes. Process Lasso, Task Manager, PowerShell, and scheduled tasks all fail silently or with "Access denied." iRacing's sim thread is hardcoded to CPU 0 internally — this cannot be changed externally.
What Process Lasso CAN do for iRacing
| Process | Setting | Value | Notes |
| iRacingSim64DX11.exe | CPU Priority | High | Not Realtime — causes instability. |
| iRacingSim64DX11.exe | I/O Priority | High | |
| iRacingSim64DX11.exe | Exclude from ProBalance | Yes ✓ | Critical — ProBalance must not throttle the sim process. |
| iRacingLocalServer64.exe | CPU Priority + I/O | High | No affinity needed. |
| iRacingService64.exe | CPU Priority + I/O | High | No affinity needed. |
| CapFrameX.exe | Exclude from ProBalance | Yes ✓ | Prevents capture tool from being throttled. |
| iOverlay.exe (or similar) | Exclude from ProBalance | Yes ✓ | |
| Discord.exe | CPU Priority | Below Normal | Keep Discord from competing with iRacing. |
| Discord.exe | CPU Affinity | Odd cores only (1,3,5,7...) | Physically isolate Discord from iRacing's cores. Discord doesn't use EAC so affinity works. |
| Discord.exe | I/O Priority | Below Normal | |
Power Profile in Process Lasso
Options → Power → Active Power Profile → AMD Ryzen Balanced (the plan created in Section 06)
08Pre-Launch Automation ScriptAUTOMATION
This script automates everything that needs to happen before each session. Save as pre_iracing_launch.bat and always run as Administrator before iRacing.
🔧This script contains values specific to one system that you must update: (1) The AMD Ryzen Balanced GUID — replace with your own from Section 06. (2) The three NVIDIA device instance IDs — find yours by running the wmic command in Section 05 and checking the registry for all instances under your GPU's VEN/DEV path. (3) The expected NVIDIA driver version string.
pre_iracing_launch.bat — update highlighted values before useCopy
@echo off
setlocal EnableDelayedExpansion
title iRacing Pre-Launch Optimizer
color 0A
net session >nul 2>&1
if %errorlevel% neq 0 (color 0C & echo [FAIL] Run as Administrator & pause & exit /b 1)
echo [OK] Running as Administrator
:: Pending reboot check
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired" >nul 2>&1
if %errorlevel%==0 (echo [WARN] Pending Windows reboot) else (echo [OK] No pending reboot)
:: Disable Xbox Game Bar
reg add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\GameDVR" /v AppCaptureEnabled /t REG_DWORD /d 0 /f >nul 2>&1
echo [OK] Xbox Game Bar disabled
:: -------------------------------------------------------
:: NVIDIA interrupt affinity — set on ALL device instances
:: Windows alternates instances on each reboot so set all
:: AssignmentSetOverride 10 hex = CPU 4 (Thread 4, Core 2)
:: UPDATE: replace the three instance IDs with YOUR values
:: -------------------------------------------------------
set NV=HKLM\System\CurrentControlSet\Enum\PCI\VEN_10DE^&DEV_2684^&SUBSYS_88EF1043^&REV_A1
:: === UPDATE THESE THREE DEVICE INSTANCE IDs === ::
reg add "%NV%\4^&15a5c2648^&0^&000B\Device Parameters\Interrupt Management\Affinity Policy" /v DevicePolicy /t REG_DWORD /d 4 /f >nul 2>&1
reg add "%NV%\4^&15a5c2648^&0^&000B\Device Parameters\Interrupt Management\Affinity Policy" /v AssignmentSetOverride /t REG_BINARY /d 10 /f >nul 2>&1
reg add "%NV%\4^&15a5c2648^&0^&000B\Device Parameters\Interrupt Management\Affinity Policy" /v DevicePriority /t REG_DWORD /d 3 /f >nul 2>&1
reg add "%NV%\4^&1babdf5b^&0^&0009\Device Parameters\Interrupt Management\Affinity Policy" /v DevicePolicy /t REG_DWORD /d 4 /f >nul 2>&1
reg add "%NV%\4^&1babdf5b^&0^&0009\Device Parameters\Interrupt Management\Affinity Policy" /v AssignmentSetOverride /t REG_BINARY /d 10 /f >nul 2>&1
reg add "%NV%\4^&1babdf5b^&0^&0009\Device Parameters\Interrupt Management\Affinity Policy" /v DevicePriority /t REG_DWORD /d 3 /f >nul 2>&1
reg add "%NV%\4^&285f7309^&0^&000C\Device Parameters\Interrupt Management\Affinity Policy" /v DevicePolicy /t REG_DWORD /d 4 /f >nul 2>&1
reg add "%NV%\4^&285f7309^&0^&000C\Device Parameters\Interrupt Management\Affinity Policy" /v AssignmentSetOverride /t REG_BINARY /d 10 /f >nul 2>&1
reg add "%NV%\4^&285f7309^&0^&000C\Device Parameters\Interrupt Management\Affinity Policy" /v DevicePriority /t REG_DWORD /d 3 /f >nul 2>&1
echo [OK] NVIDIA interrupt affinity applied to all 3 instances
:: -------------------------------------------------------
:: DISABLE services so they cannot restart mid-session
:: -------------------------------------------------------
sc config wuauserv start= disabled >nul 2>&1 & sc stop wuauserv >nul 2>&1
sc query wuauserv | find "STOPPED" >nul 2>&1
if %errorlevel%==0 (echo [OK] Windows Update disabled) else (echo [WARN] Windows Update may still be running)
sc config UsoSvc start= disabled >nul 2>&1 & sc stop UsoSvc >nul 2>&1
echo [OK] Update Orchestrator disabled
sc config WSearch start= disabled >nul 2>&1 & sc stop WSearch >nul 2>&1
sc query WSearch | find "STOPPED" >nul 2>&1
if %errorlevel%==0 (echo [OK] Windows Search disabled) else (echo [WARN] Windows Search may still be running)
:: Stop (not disable) remaining services
sc query SysMain | find "RUNNING" >nul 2>&1
if %errorlevel%==0 (sc stop SysMain >nul 2>&1 & echo [OK] SysMain stopped) else (echo [OK] SysMain already stopped)
sc query Spooler | find "RUNNING" >nul 2>&1
if %errorlevel%==0 (sc stop Spooler >nul 2>&1 & echo [OK] Spooler stopped) else (echo [OK] Spooler already stopped)
sc query WlanSvc | find "RUNNING" >nul 2>&1
if %errorlevel%==0 (sc stop WlanSvc >nul 2>&1 & echo [OK] WiFi stopped) else (echo [OK] WiFi already stopped)
sc query bthserv | find "RUNNING" >nul 2>&1
if %errorlevel%==0 (sc stop BthAvctpSvc >nul 2>&1 & sc stop BTAGService >nul 2>&1 & sc stop bthserv >nul 2>&1 & echo [OK] Bluetooth stopped) else (echo [OK] Bluetooth already stopped)
sc query XblAuthManager | find "RUNNING" >nul 2>&1
if %errorlevel%==0 (sc stop XblAuthManager >nul 2>&1 & echo [OK] Xbox Live stopped) else (echo [OK] Xbox Live already stopped)
:: Backblaze — if installed
sc query bzserv >nul 2>&1
if %errorlevel%==0 (sc query bzserv | find "RUNNING" >nul 2>&1 & if !errorlevel!==0 (sc stop bzserv >nul 2>&1 & echo [OK] Backblaze stopped) else (echo [OK] Backblaze already stopped))
:: -------------------------------------------------------
:: Power plan — UPDATE with your AMD Ryzen Balanced GUID
:: -------------------------------------------------------
powercfg /setactive YOUR-AMD-RYZEN-BALANCED-GUID >nul 2>&1
if %errorlevel%==0 (echo [OK] Power plan set to AMD Ryzen Balanced) else (echo [WARN] Could not set power plan - check GUID)
:: Process Lasso check
tasklist | find /i "ProcessLasso.exe" >nul 2>&1
if %errorlevel%==0 (echo [OK] Process Lasso running) else (echo [WARN] Process Lasso not running)
:: Defender exclusion check
powershell -command "if ((Get-MpPreference).ExclusionPath -contains 'C:\Program Files (x86)\iRacing') { exit 0 } else { exit 1 }" >nul 2>&1
if %errorlevel%==0 (echo [OK] Defender exclusion active) else (echo [WARN] Defender exclusion missing)
:: NVIDIA driver version check — UPDATE with your driver version
for /f "tokens=*" %%a in ('powershell -command "(Get-WmiObject Win32_VideoController | Where-Object {$_.Name -like '*NVIDIA*'}).DriverVersion" 2^>nul') do set DRV=%%a
if defined DRV (
if "!DRV!"=="YOUR-DRIVER-VERSION" (echo [OK] NVIDIA driver confirmed: !DRV!) else (echo [WARN] NVIDIA driver changed: !DRV! - re-verify affinity)
)
:: Final wuauserv verify
sc query wuauserv | find "RUNNING" >nul 2>&1
if %errorlevel%==0 (sc stop wuauserv >nul 2>&1 & echo [WARN] Windows Update restarted - stopped again) else (echo [OK] Windows Update confirmed stopped)
echo.
echo ============================================================
echo Ready to launch iRacing.
echo Run post_iracing_session.bat when done.
echo ============================================================
pause
Post-Session Restore Script
Save as post_iracing_session.bat — run as Administrator after racing to restore all services:
post_iracing_session.batCopy
@echo off
net session >nul 2>&1
if %errorlevel% neq 0 (echo Run as Administrator & pause & exit /b 1)
sc config wuauserv start= auto & sc start wuauserv
sc config UsoSvc start= auto & sc start UsoSvc
sc config WSearch start= delayed-auto & sc start WSearch
sc start SysMain & sc start Spooler & sc start WlanSvc
sc start bthserv & sc start BthAvctpSvc & sc start BTAGService
sc start XblAuthManager
sc query bzserv >nul 2>&1 && sc start bzserv
reg add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\GameDVR" /v AppCaptureEnabled /t REG_DWORD /d 1 /f >nul 2>&1
echo All services restored.
pause
09Results — Before & After DataDATA
All captures: 164fps cap, triple 2560×1440 240Hz, AMD Ryzen 7 7800X3D, RTX 4090. Spike threshold: >12.2ms (2× the 6.1ms target frame time at 164fps).
| Configuration | Avg | StDev | P99 | P99.9 | Worst | Spikes/5min |
| Baseline — No fixes applied |
| GPU burst stutter (Type A) | 6.10 | 0.33 | 6.92 | 7.41 | 27.62ms | 1 |
| Complex track, no fixes | 6.10 | 0.43 | 7.07 | 7.65 | 32.10ms | 2 |
| After graphics settings (Fix A) |
| MSAA 2x, crowds off, mem swap off | 6.10 | 0.35 | 7.07 | 7.63 | 8.43ms | 0 |
| After driver update + 240Hz + Reflex off |
| New driver, correct refresh rate | 6.08 | 0.32 | 6.93 | 7.36 | 17.14ms | 1 |
| After NVIDIA affinity + Process Lasso + services disabled |
| Full fix applied — session 1 | 6.08 | 0.33 | 6.98 | 7.59 | 8.80ms | 0 |
| Full fix applied — session 2 | 6.08 | 0.35 | 7.02 | 7.62 | 10.84ms | 0 |
| Full fix applied — session 3 | 6.08 | 0.40 | 7.15 | 7.76 | 8.95ms | 0 |
| Regression — RTSS discovered running |
| RTSS active (CapFrameX overlay) | 6.08 | 0.51 | 7.62 | 8.39 | 27.12ms | 3 |
| After RTSS uninstalled |
| RTSS removed, iOverlay only | 6.08 | 0.54 | 7.62 | 8.52 | 10.71ms | 0 |
10Hardware Compatibility NotesHARDWARE
Ryzen 7 7800X3D
V-Cache: Single CCD, all 8 cores share the cache
Best power plan: AMD Ryzen Balanced
CPU affinity for iRacing: Blocked by EAC
Interrupt affinity target: CPU 4 (Thread 4, Core 2)
Tested: ✓ This guide is based on 7800X3D testing
Ryzen 9 9800X3D
V-Cache: Single CCD, same topology as 7800X3D
Best power plan: AMD Ryzen Balanced (same)
CPU affinity for iRacing: Blocked by EAC (same)
Interrupt affinity target: CPU 4 recommended (same logic)
Tested: Not directly tested — same architecture, fixes should apply
Windows 11
MSI interrupt affinity: Unreliable — Windows overrides settings for MSI-mode devices
Workaround: Apply registry fix to all device instances via pre-launch script before every session
Note: The affinity fix works on some Win11 systems consistently, others inconsistently. Run LatencyMon to verify.
Windows 10
MSI interrupt affinity: More reliable than Windows 11
GoInterruptPolicy: More likely to persist across reboots
Service names: Same as Windows 11
Note: If on Windows 10 and the affinity fix persists, you may not need the pre-launch script for the NVIDIA section.
Other NVIDIA GPU Notes
The interrupt affinity approach should work for any NVIDIA GPU, but the number of device instances in the registry varies. Some systems show only one instance, others show two or three. Run the wmic command in Section 05 to find yours. The AssignmentSetOverride bitmask value (10 hex = CPU 4) is a good starting point — use AutoGpuAffinity (github.com/valleyofdoom/AutoGpuAffinity) to benchmark and find the optimal core for your specific system.
Single Screen vs Triple Screen
The GPU load differences between single and triple screen are significant. All settings in this guide are tuned for triple 2560×1440. Single screen users may be able to run higher settings (MSAA 4x, crowds on) without triggering Type A GPU burst spikes. The CPU-side fixes (services, interrupt affinity, power plan) apply equally to both setups.
11Fresh Build ChecklistREFERENCE
Windows & Drivers
- Run all Windows Updates completely before installing anything else
- Install AMD chipset drivers from amd.com/support — verify AMD Ryzen Balanced appears in
powercfg /list
- Install NVIDIA display driver only — custom install, uncheck GFE, PhysX, NVIDIA App
- Uninstall RivaTuner Statistics Server and MSI Afterburner if present
- Disable WiFi adapter in Device Manager if on wired ethernet
- Add Windows Defender exclusions for iRacing (Section 04)
Power & Performance
- Create AMD Ryzen Balanced power plan (Section 06) — save the GUID
- Install Process Lasso — enable start with Windows — set AMD Ryzen Balanced as power profile
- Configure Process Lasso per Section 07 — exclude iRacing sim from ProBalance
NVIDIA Interrupt Affinity
- Find all GPU device instances (Section 05 wmic command)
- Apply interrupt affinity registry fix to all instances (Section 05)
- Reboot and verify with LatencyMon — CPU 4 should show elevated DPC activity
- Update pre-launch script with your device instance IDs
NVIDIA Control Panel
- Add iRacingSim64DX11.exe to Program Settings with values from Section 03
- Confirm all monitors set to maximum Hz
iRacing Configuration
- Apply iRSidekick graphics settings from Section 02
- Edit app.ini — add texture preload and sound stream keys (Section 02)
- Frame cap = monitor Hz − 1. C-States disabled in BIOS. EXPO/XMP enabled for RAM.
Pre-Session Routine
- Update pre-launch script with your GUID and device IDs
- Run pre-launch script as Administrator before every session
- Confirm Process Lasso running in system tray
- Wait at least one full lap before starting CapFrameX capture
- Run post-session script after racing to restore services
12Revert ReferenceSAFETY NET
NVIDIA Interrupt Affinity (Registry)
→ Applied: DevicePolicy=4, AssignmentSetOverride=10, DevicePriority=3 on all instances
← Revert: delete the Affinity Policy key for each instance and reboot
reg delete "HKLM\System\CurrentControlSet\Enum\PCI\YOUR_DEVICE_ID\Device Parameters\Interrupt Management\Affinity Policy" /f
Power Plan
→ Applied: AMD Ryzen Balanced
← Revert: switch in Control Panel → Power Options or via powercfg /setactive with original GUID
MSAA Setting
→ Applied: 2x in iRSidekick Graphics tab
← Revert: Graphics tab → MSAA Samples → 4x
Note: visual quality improvement at cost of GPU load at complex corners.
Video mem swap high-res cars
→ Applied: Unchecked in iRSidekick Extras tab
← Revert: Extras tab → check "Video mem swap high-res cars"
Only revert if VRAM pressure becomes an issue with large grids.
Windows Defender Exclusions
→ Applied: iRacing folders excluded from real-time scanning
← Revert in admin PowerShell:
Remove-MpPreference -ExclusionPath "C:\Program Files (x86)\iRacing"
Remove-MpPreference -ExclusionPath "$env:USERPROFILE\Documents\iRacing"
Refresh Rate
→ Applied: Monitor maximum Hz in iRSidekick and Windows
← Revert: Monitor/Display tab in iRSidekick
No reason to revert — running at max Hz is always correct.
NVIDIA Control Panel — Low Latency Mode
→ Applied: Ultra
← Revert: NVIDIA Control Panel → Manage 3D Settings → iRacingSim64DX11.exe → Low Latency Mode → Off