Je teller zegt 160. De game schokt toch — een fractie van een seconde waarin het beeld stilstaat, je vizier ergens belandt waar je het niet hebt gezet, en daarna is alles weer in orde. De teller bewoog niet, en daarom helpt niets wat je doet om hem te verhogen.
Dat gat is het hele onderwerp van deze pagina. Gestotter is een frame dat te laat aankwam, geen lage framerate. Een frameteller middelt over een seconde, dus één frame dat 90 ms duurde verdwijnt tussen de 159 korte frames ernaast. Het getal dat beschrijft wat je voelde is de frametijd, en gestotter is een frame dat veel trager is dan zijn buren.
Eerst de eerlijke zin. Twee van de tien oorzaken hieronder komen overeen met één vakje in w0a: de plannerwaarde in oorzaak 8 en het opnameprogramma op de achtergrond in oorzaak 9. Beide vakjes zetten alleen een instelling waar ze hoort, en op een machine waaraan niemand heeft gesleuteld, vindt het eerste niets om te veranderen. Of de stotter die je voelt een van deze twee was, kan alleen een opname van ervoor en erna je vertellen.
Bepaal eerst welk van drie problemen je hebt
Ze krijgen hetzelfde woord opgeplakt en hebben bijna niets gemeen.
- Haperingen. De basislijn is in orde en af en toe gebeurt er iets langs. Dat is deze pagina.
- Een onrustige basislijn. Niets is dramatisch, maar de game voelt nooit vloeiend. Dat is een probleem met percentielen: Hoge gemiddelde FPS maar slechte 1% lows.
- Een drop. De framerate valt terug en blijft seconden of minuten laag. Totaal andere oorzaken: Plotselinge FPS-drops in games.
Leg iets vast voordat je iets verandert
Gokken is wat hier weken van maakt. Een opname van de game die je werkelijk speelt, op de plek waar hij werkelijk stottert, maakt van "wat zou het kunnen zijn" de vraag "wat gebeurde er bij die uitschieter" — en het is het "voor" waartegen elke latere verandering wordt beoordeeld. De benchmark lezen legt uit hoe.
De oorzaken, één voor één
1. Een stuurprogramma dat een processorkern vasthoudt
Zolang een stuurprogramma in een interrupt of in een uitgestelde aanroep zit, draait die kern boven elke threadprioriteit die er is: hij tekent niets en leest geen invoer tot het stuurprogramma loslaat. Het is een oorzaak die je makkelijk over het hoofd ziet: hij duikt in geen enkele frametime-grafiek en in geen enkele taakbeheerder op.
Hoe je het ziet: meet het. Het kernelgedeelte van De latencytest lezen somt elk stuurprogramma op dat een kern heeft vastgehouden, op langste vasthoudtijd, met de bestandsnaam. Voorbij ongeveer 1 ms verdringt een stuurprogramma invoerrapporten; vanaf 4 ms kan de machine geen stabiele frametijd vasthouden, wat je verder ook verandert.
Wat je doet: werk dat ene stuurprogramma bij, bij de hardwarefabrikant — niet het hele systeem, het genoemde bestand. Netwerk-, opslag- en audiostuurprogramma's horen bij de stuurprogramma's die dit kunnen doen.
2. Shaders die worden gecompileerd
Nieuw effect, nieuw gebied, nieuw wapen, en de game moet een shader compileren voordat hij hem kan tekenen. Het compileren gebeurt op de CPU terwijl het frame wacht.
Hoe je het ziet: het is het ergst in de eerste minuten van een sessie of een map, het zakt weg terwijl je speelt, en het komt terug na een update van een driver of van de game. Zakt je gestotter niet weg, dan is dit het niet — Stotteren door shadercompilatie is de lange versie.
Wat je doet: speel er doorheen, en benchmark niet binnen dat venster; je zou de compiler meten.
3. De schijf waarvan de game streamt
Een game die assets binnenhaalt terwijl je beweegt, stottert wanneer de leesactie traag is, en het frame dat op die gegevens wacht is het late frame.
Hoe je het ziet: de haperingen vallen samen met het betreden van een nieuw gebied, en lange frame-intervallen vallen in hetzelfde venster als schijfactiviteit. Controleer de voor de hand liggende dingen: staat de game op een mechanische schijf, is de schijf bijna vol, staat de gamemap in een map die met de cloud synchroniseert en elke schrijfactie uploadt, staat het wisselbestand op een draaiende schijf. Een SSD voor een game die streamt is geen tweak, het is het antwoord.
4. Geheugendruk
Loopt het RAM vol, dan verplaatst Windows pagina's naar de schijf, en de pagina's die terugkomen voel je als haperingen. Het minder voor de hand liggende geval is de commit-limiet: raakt het totale geheugen dat Windows kan uitdelen op, dan snoeit de geheugenbeheerder pagina's weg bij programma's die nog draaien, en de game voelt dat snoeien als bevriezingen van minder dan een seconde. Allebei worden ze beter op het moment dat je een browser met veertig tabbladen sluit.
5. Er draait iets anders
Het werkproces van Windows Update, een onderhoudstaak, een geplande malwarescan, een video-export die je was vergeten. Dat werk stopt niet wanneer een game start; het komt in de wachtrij voor dezelfde kern als de renderthread, dus het duikt op als uitschieters in de frametijd en niet als een lager gemiddelde. Het afwachten is een legitieme oplossing.
Hoe je het ziet: een benchmarkopname bewaart haar langste frame-intervallen met de schijfactiviteit en hard faults die in hetzelfde tijdvenster vielen. Waren dat onderhouds- of antivirusprocessen van Windows, dan telt de kaart met lange intervallen die intervallen en noemt ze de processen. Dat is wat samenviel, geen bewijs dat dat werk de frame vertraagde: de antivirus leest alles wat welk programma dan ook opent.
6. Hitte en vermogenslimieten
Bereikt een chip zijn temperatuur- of vermogensplafond, dan wordt de klok herhaaldelijk omlaaggetrokken en weer opgeduwd, en golvende frametijden zijn hoe dat van binnenuit voelt. De firmware neemt die beslissing zelf, zonder het aan Windows te vragen. Het begint na een tijdje en niet meteen, en het loopt mee met hoe warm de kamer is.
7. Het beeldscherm
Een monitor die onder de verversingsfrequentie draait die hij aankan, legt een bodem onder je frametempo die de hardware niet nodig heeft. Controleer de werkelijke frequentie in plaats van hem aan te nemen; op verrassend veel machines staat hij verkeerd na een schone installatie of het verwisselen van een kabel.
8. Een plannerwaarde die een ouder programma heeft achtergelaten
Win32PrioritySeparation bepaalt hoe lang een thread de processor houdt en hoeveel meer tijd de toepassing op de voorgrond krijgt. Waarden met lange of vaste quantums, of met een voorgrondaandeel onder 3:1, veranderen hoe de processor wordt verdeeld tussen de game en al het andere; wat dat met de frametijd doet, is niet gemeten. De kaart Geheugen en systeemstandaarden op de pagina Fix zet de Windows-standaard terug.
9. Overlays en de opnamelaag
Overlays tekenen binnen het eigen frame van de game, en een opnameprogramma op de achtergrond codeert elk frame zodat de laatste paar minuten bewaard kunnen worden. Sluit ze één voor één en test, in plaats van allemaal tegelijk.
10. De partij, niet de machine
Een online game kan voor iedereen op de server tegelijk haperen. Is singleplayerinhoud op dezelfde machine schoon en laat de frametime-opname zien dat de game normaal presenteert, dan is dat een werkelijk bruikbaar antwoord: het ligt niet aan je pc.
De twee oorzaken waarvoor w0a een vakje heeft
Oorzaak 8: "De voorgrondprioriteit op de juiste waarde houden (Win32PrioritySeparation)" (pagina Optimalisaties)
Eén DWORD-waarde: Win32PrioritySeparation onder HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\PriorityControl.
De referentie van Microsoft hiervoor is een gearchiveerde pagina die voor Windows 2000 is geschreven; ze beschrijft zes bits die in drie paren worden gelezen, geschreven als AABBCC:
| Paar | Bepaalt | Waarden |
|---|---|---|
| AA (de twee hoogste bits) | Hoe lang een thread per keer mag draaien | 01 langer, 10 korter, 00 of 11 de eigen standaard van de editie (korter op een werkstationeditie) |
| BB (de twee middelste) | Of die lengte varieert | 01 variabel, 10 vast, 00 of 11 de standaard van de editie (variabel op een werkstationeditie) |
| CC (de twee laagste) | Hoeveel meer tijd het programma op de voorgrond krijgt | 00 gelijk (en vast), 01 2:1, 10 of 11 3:1. Wordt alleen gebruikt als het middelste paar variabel betekent. |
- Windows-standaard:
0x2(binair 000010). Op een werkstationeditie betekent dat kortere, variabele quantums, waarbij het programma op de voorgrond drie keer zoveel tijd krijgt als de achtergrond. Dezelfde referentie geeft0x26(100110: korter, variabel, 3:1) voor de keuze in de prestatieopties die programma's voorrang geeft, en0x18(011000: langer, vast, gelijk) voor de keuze die achtergrondservices voorrang geeft. - Wat het vakje doet: het leest eerst de waarde. Een waarde die de voorgrond al het aandeel van 3:1 geeft, zonder langere quantums en zonder vaste quantums, blijft precies zoals ze is, en het vakje zegt dat. Alleen een waarde die niet aan een van die drie voorwaarden voldoet, wordt herschreven, naar
0x26. Op de eigen standaard van Windows schrijft het vakje niets: op een clienteditie plant0x2al zoals0x26vraagt. - Wanneer het ingaat: na een herstart. De kernel zet deze waarde bij het opstarten om in zijn planningstabel, dus haar in het register veranderen verandert niets aan de planner die al draait, en het vakje vraagt om een herstart wanneer het schrijft.
- Terug: de kaart Geheugen en systeemstandaarden schrijft
2terug en vraagt om een herstart. Tegelijk zet hij ook andere standaarden voor geheugen en planner terug.
Oorzaak 9: "Xbox Game DVR uitschakelen" (pagina Optimalisaties)
| Waarde | Het vakje schrijft | Windows-standaard (wat de reparatiekaart terugzet) |
|---|---|---|
HKCU\System\GameConfigStore, GameDVR_Enabled | 0 | 1 |
HKLM\SOFTWARE\Policies\Microsoft\Windows\GameDVR, AllowGameDVR | 0 | niet aanwezig |
HKCU\Software\Microsoft\Windows\CurrentVersion\GameDVR, AppCaptureEnabled | 0 | 1 |
HKCU\Software\Microsoft\GameBar, ShowStartupPanel | 0 | niet aanwezig |
HKCU\Software\Microsoft\GameBar, UseNexusForGameBarEnabled | 0, behalve op een Ryzen X3D met twee CCD's | niet aanwezig |
Allemaal DWORD. Op een X3D-processor met twee CCD's laat het vakje de laatste waarde met rust: de opnameketen gaat toch uit, maar het deel van Game Bar waar het stuurprogramma van AMD naar luistert, blijft draaien. Dat is een voorzorg, geen bewezen oorzaak, en de melding van het vakje zegt welke weg het nam. Ryzen X3D, Game Bar en core parking legt uit waarom dat deel op die chips telt.
- Wanneer het ingaat: w0a vraagt voor dit vakje niet om een herstart.
- Wat je opgeeft: de opname van Game Bar. Gaat Win+G niet meer open of wil je de opname terug, dan zet de kaart Game Bar / game-opname Game Bar en Game DVR weer aan met de Windows-standaarden.
- Wat de stotterscan zegt: hij noteert, als informatie, wanneer
GameDVR_EnabledofAppCaptureEnablednog aan staat; beide zijn 1 op een schone installatie, dus dat is de standaard, geen fout. Hij leest ook een derde waarde,HistoricalCaptureEnabled(opname op de achtergrond), maar alleen om zijn formulering te kiezen; het vakje schrijft die waarde niet.
Controleer het zelf
Deze opdrachten lezen alleen:
reg query "HKLM\SYSTEM\CurrentControlSet\Control\PriorityControl" /v Win32PrioritySeparation
reg query "HKCU\System\GameConfigStore" /v GameDVR_Enabled
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\GameDVR"
reg query "HKLM\SOFTWARE\Policies\Microsoft\Windows\GameDVR" /v AllowGameDVR
reg query "HKCU\Software\Microsoft\GameBar"
Zo lees je de antwoorden:
- Waarden worden hexadecimaal getoond:
Win32PrioritySeparation REG_DWORD 0x26betekent0x26. 0x2is de Windows-standaard en0x26is de keuze uit de referentie die programma's voorrang geeft; op een clienteditie plannen ze allebei hetzelfde.0x18is de keuze die achtergrondservices voorrang geeft: langere, vaste quantums en geen extra aandeel voor de voorgrond, en precies daar gaat oorzaak 8 over. Schrijf elke andere waarde als zes binaire cijfers en lees haar met de tabel hierboven.- Voor Game DVR betekent
0x0uit (het vakje) en0x1aan (de Windows-standaard). - Eindigt de opvraag van
AllowGameDVRmet een fout in plaats van een regel, dan bestaat de beleidswaarde niet, en dat is de Windows-standaard.
Wat de scan hiermee doet
Wat de stotterscan zoekt draait deze controles tegen wat Windows en je stuurprogramma's al hebben vastgelegd, en merkt elke bevinding aan als bewezen, waarschijnlijk, kandidaat of niet gecontroleerd. Twee dingen die het waard zijn om te weten: een scan die altijd tien problemen vindt verkoopt je de oplossingen, en een controle die niet kon draaien wordt geteld in plaats van stilzwijgend als schoon behandeld.
Verander daarna één ding en neem dezelfde scène opnieuw op. Vijf veranderingen en één meting vertellen je niets over welke ervan ertoe deed, en alles wat geen getal heeft bewogen hoort teruggedraaid te worden.
Dingen die niet de oorzaak zijn
Dit alles gaat eindeloos rond als oplossing tegen gestotter, en w0a weigert elk van deze waarden te schrijven, om vastgelegde redenen:
DisablePagingExecutive,LargeSystemCacheenDisablePageCombiningveranderen het geheugenbeheer van de kernel;NtfsMemoryUsageverandert de pool van het NTFS-stuurprogramma;IoPageLockLimitenSecondLevelDataCachezijn eveneens aannames van de kernel. Waarden op kernelniveau zijn een productregel: ze worden nooit geschreven.GlobalTimerResolutionRequestsstaat onderSession Manager\kernel, een sleutel die het product volledig weigert.MSISupportedwisselt de interruptmodus van een apparaat; verkeerd gezet kan het resultaat een zwart scherm zijn.FeatureSettingsOverrideenFeatureSettingsOverrideMaskschakelen de beschermingen tegen Spectre en Meltdown uit.OverlayTestModeenDisableOverlaysschakelen multi-plane overlay (MPO) uit. Op een echte machine met Windows 11 25H2 lieten ze CS2 volledig en herhaalbaar bevriezen.TdrDelayenTdrDdiDelayverlengen de watchdog van het grafische stuurprogramma, waardoor elke bevriezing alleen langer duurt;TdrLevelschakelt het herstel uit.
Op een machine die geen geheugen tekortkomt verandert een geheugenopschoner niets meetbaars.
Gerelateerd
- Plotselinge FPS-drops in games
- Stotteren door shadercompilatie
- De latencytest lezen
- Wat de stotterscan zoekt
- Hoge gemiddelde FPS maar slechte 1% lows
- DPC-latency: wanneer het stuurprogramma zelf de hapering is
- Ongedaan maken wat w0a heeft gewijzigd
Speel je CS2? Welke startopties nog iets doen en waar de frames in het videomenu werkelijk zitten: Lage FPS en gestotter in CS2: een gemeten checklist
Heeft deze pagina geholpen?
Wat ontbrak, of wat werkte er niet? We lezen elk van deze berichten.
Heeft deze pagina het niet opgelost, schrijf ons dan — noem het artikel dat je hebt gelezen, dan verbeteren we het.