Frames Per Second, Explained
I dag tar vi upp en av de vanligaste frågorna vi får om PC-spel: hur många bilder per sekund behöver du? Bör du köra med samma bildfrekvens som skärmens maximala uppdateringsfrekvens, till exempel 60 FPS på en 60 Hz-skärm, eller finns det en fördel att köra spel med en mycket högre bildfrekvens än vad skärmen kan visa, till exempel 500 FPS?
För att svara på den här frågan måste vi prata lite om hur en GPU och en bildskärm arbetar tillsammans för att skicka bilder till dina ögonglober, och hur tekniker som Vsync fungerar.
Men i grund och botten är det så att om du kör spel med extremt höga bildfrekvenser, långt över bildskärmens uppdateringsfrekvens, så kommer det att leda till en mer responsiv spelupplevelse med lägre upplevd inmatningslatens. Det är svaret på frågan för dem som inte vill vänta till slutet. Nu ska vi prata om varför.
Redaktörens anmärkning: Det här inslaget publicerades ursprungligen den 2 augusti 2018. Det är lika relevant och aktuellt idag som då, så vi har bumpat det som en del av vårt initiativ #ThrowbackThursday.
Låt oss anta att vi har en bildskärm med en fast uppdateringsfrekvens på 60 Hz. Med andra ord uppdaterar monitorn sin bildskärm var 1/60:e sekund, eller var 16,7 ms. När man kör ett spel finns det ingen garanti för att GPU:n kan rendera varje bild på exakt 16,7 millisekunder. Ibland kan det ta 20 ms, ibland 15 ms och ibland 8 ms. Det är den varierande karaktären av att rendera ett spel på en GPU.
Med denna varierande renderingshastighet finns det ett val av hur varje renderad bild överförs till bildskärmen. Den kan vidarebefordra den nya bilden till skärmen så snart den är helt renderad, allmänt känt som att köra spelet med ”Vsync” eller vertikal synk av, eller så kan den vänta tills skärmen är redo att uppdateras innan den skickar den nya bilden, känt som ”Vsync on”.
Vsync off
Användning av den första metoden, Vsync off, orsakar tårbildning. Detta beror på att en bildskärm inte kan uppdatera hela bilden ögonblickligen, utan den uppdaterar istället rad för rad, vanligtvis från toppen av skärmen till botten. Under denna process kan en ny bild bli klar från GPU:n, och eftersom vi inte använder Vsync skickas bilden till skärmen omedelbart. Resultatet är att mitt i en uppdatering tar skärmen emot nya data och uppdaterar resten av raderna på skärmen med dessa nya data. Du får då en bild där den övre halvan av skärmen är från den tidigare ramen och den nedre halvan är från den nya, nytillgängliga ramen.
Tearing
Avhängigt av det innehåll som visas presenterar sig denna uppdelning mellan nya och gamla ramar i en enda uppdatering som en tear, eller en synlig linje mellan de gamla och nya ramarna. Vanligtvis är det mest märkbart i snabbt rörliga scener där det finns en stor skillnad mellan en bild och nästa.
Vync off leder visserligen till tearing, men har fördelen att en bild skickas till skärmen så snart den är färdigrenderad, vilket ger en låg latens mellan GPU:n och skärmen. Ha det i åtanke för senare.
Vsync on
Det alternativa sättet att visa en bild är med Vsync on. Här skickar GPU:n i stället för att skicka den nya bilden omedelbart till skärmen, blandar den varje renderad bild i en buffert. Den första bufferten används för att lagra den bild som bearbetas för tillfället och den andra bufferten används för att lagra den bild som skärmen för tillfället visar. Vid ingen tidpunkt under uppdateringen uppdateras den andra bufferten, så displayen visar bara data från en fullt renderad bildruta, och som ett resultat av detta får du inte tårar från en uppdatering mitt i uppdateringen.
Vsync on, a closer look
Den enda tidpunkt då den andra bufferten uppdateras är mellan uppdateringarna. För att se till att detta sker väntar GPU:n efter att den avslutat renderingen av en bildruta, tills skärmen är på väg att uppdateras. Därefter blandar den buffertarna, börjar rendera en ny ram och processen upprepas. Ibland kan processen innebära flera buffertar innan en ram når skärmen, men detta är den allmänna innebörden av hur Vsync fungerar.
När GPU:n är för långsam för att rendera en ram… uppstår stuttring
Det finns två problem med Vsync. För det första, om GPU:ns renderingshastighet är för långsam för att hålla jämna steg med skärmens uppdateringsfrekvens – säg att den bara klarar av att rendera med 40 FPS på en 60 Hz-skärm – då kommer GPU:n inte att rendera en hel bild i tid för att möta starten av skärmens uppdatering, så en bild upprepas. Detta orsakar stamning eftersom vissa ramar bara visas en gång, medan andra visas två gånger.
Vsync on: 60 Hz-skärm, 200 FPS
Det andra problemet uppstår när GPU:n är mycket snabb och lätt kan rendera en bild inom intervallet för uppdateringsfrekvensen. Låt oss säga att den kan rendera med 200 FPS och producera en ny ram var 5:e ms, förutom att du använder en 60 Hz-skärm med ett uppdateringsfönster på 16,7 ms.
Med Vsync aktiverad kommer din GPU att slutföra nästa bild som ska visas inom 5 ms, sedan kommer den att vänta i 11,7 ms innan den skickar bilden till den andra bufferten för att visas på monitorn och börjar på nästa bild. Det är därför som den högsta bildfrekvensen du får med Vsync på motsvarar uppdateringsfrekvensen på din bildskärm, eftersom GPU:n i princip är ”låst” till att inte rendera snabbare än uppdateringsfrekvensen.
Nu är det vid den här punkten som det finns en hel del förvirring.
Vi hör ofta saker som ”att låsa GPU:n till min bildskärms uppdateringsfrekvens med Vsync är bra, för om den renderar snabbare än uppdateringsfrekvensen är dessa ramar bortkastade eftersom bildskärmen inte kan visa dem, och allt jag får är tearing”. Många pekar på energibesparingar genom att använda Vsync; din GPU behöver inte arbeta lika hårt, det finns ingen fördel med att köra med högre bildfrekvenser än skärmens uppdateringsfrekvens, så kör med en låst FPS och spara lite energi.
Vi kan förstå varför folk kommer fram till den här slutsatsen, och det finns några bitar av sanning där, men det är inte korrekt i allmänhet. Och anledningen till detta är att du inte tar hänsyn till den tid som ingångarna bearbetas och hur lång tid det tar för dessa ingångar att materialiseras på skärmen.
Vsync on inklusive input
För att förklara varför detta är fallet, låt oss titta på Vsync on-diagrammet, men överlagra diagrammet med input från musen och tangentbordet, som vanligtvis samlas in var 1ms. Låt oss också använda samma exempel där vi har en GPU som kan rendera vid 200 FPS med en 60 Hz-skärm.
Med Vsync och ett enkelt buffertsystem börjar GPU:n i denna förenklade förklaring i denna förenklade förklaring att rendera en ram som motsvarar din musinmatning så snart den tar emot denna inmatning, vid tid 0. Det tar sedan 5 ms att rendera ramen och den väntar ytterligare 11,7 ms innan den skickar den till displaybufferten.
Displayen tar sedan en viss tid på sig för att ta emot den ram som ska renderas och fysiskt uppdatera displayen rad för rad med denna information.
Vsync on including input
Även i bästa fall har vi en fördröjning på minst 16,7 ms mellan din inmatning och när displayen kan börja visa resultatet av denna inmatning för dig.
När man räknar in fördröjning av displayens inmatning, processorens bearbetningstid och så vidare kan fördröjningen mellan inmatning och uppdatering av displayen lätt bli mer än 50 ms.
Vsync off inklusive inmatning, 60 Hz-skärm, 200 FPS
Nu ska vi titta på diagrammet för Vsync off. GPU:n renderar kontinuerligt oavsett när skärmen uppdateras och tar 5 ms på sig för att förvandla din inmatning till en komplett bildruta. Skärmen kan sedan börja visa den nya ramen omedelbart, även om det kanske bara är en del av ramen. Resultatet är att latensen mellan din inmatning i spelet och när skärmen kan börja visa resultatet av den inmatningen minskar från 16,7 ms till endast 5 ms. Och det kommer inte att finnas några ytterligare buffertar i verkliga implementationer; det är lika snabbt som detta plus din bildskärms inmatningsfördröjning.
Och det är där du får fördelen. I det här exemplet minskar inmatningsfördröjningen till 5 ms när man kör med 200 FPS med Vsync avstängd på en 60 Hz-skärm, medan den fördröjningen är minst 16,7 ms, om inte mer, när Vsync är aktiverad.
Även om skärmen inte kan visa alla 200 bilder per sekund i sin helhet, produceras det som skärmen visar var 1/60:e sekund från en inmatning som ligger mycket närmare den aktuella bilden i tid.
Detta fenomen gäller förstås också med monitorer med hög uppdatering. Vid 144 Hz, till exempel, kommer du att kunna se många fler bilder varje sekund, så du får en smidigare och mer responsiv upplevelse överlag. Men om du kör med 200 FPS med Vsync av i stället för 144 FPS med Vsync på kommer du ändå att få en skillnad på mellan 5 ms och uppåt 7 ms i inmatningslatens.
När vi nu pratar om skillnader på millisekunder undrar du förmodligen om du faktiskt kan märka denna skillnad i spel.
Avhängigt av vilken typ av spel du spelar kan skillnaden vara allt från mycket märkbar, till ingen skillnad alls. Ett snabbt spel som CS: GO som körs med 400 FPS på en 60 Hz-skärm, med en inmatningslatens som bäst runt 2,5 ms, kommer att kännas betydligt mer responsivt på dina musrörelser än om du körde samma spel med 60 FPS med 16,7 ms latens (eller mer).
I båda fallen visar skärmen bara en ny bildruta 60 gånger i sekunden, så det kommer inte att kännas lika smidigt som på en 144 Hz- eller 240 Hz-skärm. Men skillnaden i inmatningslatens är enorm; om du kör med 400 FPS kan du få dina inmatningar till skärmen nästan 7 gånger snabbare, om inte mer. Prova själv och du kommer garanterat att känna skillnaden i reaktionsförmåga.
Och vi har inte bara dragit den här förklaringen från ingenstans, i själva verket känner Nvidia till Vsyncs begränsningar när det gäller inmatningslatens, vilket är anledningen till att de tillhandahåller ett alternativ som kallas Fast Sync (AMD:s alternativ kallas Enhanced Sync). Denna teknik för synkronisering av bildskärmar är som en kombination av Vsync on och Vsync off, vilket ger det bästa av två världar.
Fast Sync fungerar genom att införa en extra buffert i Vsync on-pipelinen som kallas den senast renderade bufferten. Detta gör det möjligt för GPU:n att fortsätta att rendera nya ramar i bakre bufferten och övergå till den senast renderade bufferten när den är klar. Vid en uppdatering av skärmen skjuts sedan den senast renderade bufferten till den främre bufferten som skärmen får tillgång till.
Fast Sync / Enhanced Sync
Fördelen som detta skapar är att GPU:n inte längre väntar efter att ha slutfört en bildruta på att uppdateringen av skärmen ska inträffa, som det är fallet med Vsync on. Istället fortsätter GPU:n att rendera ramar, så att när skärmen går till en ram i början av uppdateringsperioden har den ramen renderats närmare uppdateringsfönstret. Detta minskar inmatningslatensiteten. Men till skillnad från när Vsync är avstängd levererar Fast Sync en färdig bildruta till skärmen i början av varje uppdatering, i stället för att helt enkelt skjuta bilden till skärmen omedelbart, och det är den här tekniken som eliminerar tearing.
Fast Sync fungerar bara när bildfrekvensen är högre än skärmens uppdateringsfrekvens, men den lyckas ge en mer responsiv spelupplevelse utan att det uppstår tearing. Och naturligtvis har AMD en motsvarighet som kallas Enhanced Sync.
Förhoppningsvis har den här förklaringen klarat upp några av dina frågor om varför det ger en mer responsiv spelupplevelse att köra ett spel över skärmens maximala uppdateringsfrekvens, och varför möjligheten att köra spel med högre bildfrekvenser alltid är en fördel, även om det kan tyckas att skärmen inte kan dra nytta av det.
En sista anmärkning: Vi har inte diskuterat adaptiva synkroniseringstekniker som G-Sync och FreeSync här, och det beror på att vi mestadels har talat om att köra spel över den maximala uppdateringsfrekvensen, där adaptiv synkronisering inte gäller. Det finns många olika synkroniseringsmetoder där ute, men adaptiv synkronisering skiljer sig mycket från Vsync och Fast Sync som vi har talat om, och är åtminstone för den här diskussionen inte riktigt relevant.
Fortsatt läsning
- De bästa spelmonitorer
- FreeSync 2 förklarat
- De bästa grafikkort 2018
Shopping genvägar
- Radeon RX 570 på Amazon, Newegg
- Radeon RX 580 på Amazon, Newegg
- GeForce GTX 1060 6GB på Amazon
- GeForce GTX 1070 Ti på Amazon, Newegg
- GeForce RTX 2070 på Amazon, Newegg
- GeForce RTX 2080 på Amazon, Newegg
- GeForce RTX 2080 Ti på Amazon, Newegg
Masthead credit: Foto: Jakob Owens