reinterpretcast
A fenti példában először úgy tűnhet, hogy a 0,26 Hz-es frissítési frekvencia és a 0,2 FPS (Frames Per Second) képfrissítési sebesség elég közel áll a helyes megjelenítéshez, azonban a demó futását figyelve egyértelmű, hogy a kettő teljesen nincs szinkronban, így a képernyőszakadás rendszeresen előfordul.
A valódi probléma ezzel a példával az, hogy ez egy “egypufferes alkalmazás”. A képkockáinkat közvetlenül a pufferbe írjuk, amely a kijelzőhöz kerül, és így amikor a kijelző frissíteni akarja a képét, fennáll a veszélye, hogy olyan képkockát kap, amely még nincs teljesen kész. Egy valós alkalmazásban a képkockasebesség gyakran drámaian változhat bizonyos körülményektől függően, ami ronthatja ezt a problémát az egypufferes alkalmazásoknál, és még kiszámíthatatlanabbá teheti a képernyőszakadást.
Dupla pufferelés
Egy mód arra, hogy enyhítsük e problémák egy részét, a dupla pufferelés használata. Ez a rajzolási módszer abból áll, hogy a képkockaadatokat egy hátsó pufferbe írjuk, és csak akkor másoljuk át az elsődleges pufferbe (a kijelző videótáplálásába), amikor egy képkocka elkészült. Így a felhasználó soha nem fog félig kész képkockákat látni, igaz? Tévedés.
Míg a képernyőszakadás a dupla puffereléssel jelentősen csökken, az adatok másolása időt vesz igénybe, és így teljesen lehetséges, hogy a monitor a puffer-másolási folyamat felénél frissíti a képet! Ez a probléma pontosan úgy szemléltethető, mint az egypufferes tépődés – az előző bemutatóban csak képzeljük el, hogy az elsődleges pufferbe írt pixeleket nem közvetlenül a grafikus kártya generálja, hanem a másodlagos pufferből történő másolási művelet eredményeként kerülnek szekvenciálisan a pufferbe.
Kettős pufferelés + VSync
Egy további enyhítő taktika a VSync használata. A VSync a “vertikális szinkronizálás” rövidítése, a VSync úgy működik, hogy a hátsó puffer csak közvetlenül a kijelző frissítése után írhat az elsődleges pufferbe. A remény az, hogy a puffer másolási művelet a következő frissítés előtt befejeződik. Ez drasztikusan csökkenti a képernyőszakadást, azonban vannak problémái.
Ha magas képfrissítési sebességű alkalmazással rendelkezik, a VSync általában tökéletesen működik. A framerátád a monitorod frissítési sebességére korlátozódik, de ez rendben van, mert a monitorod amúgy is ezzel a sebességgel jelenítene meg. A probléma akkor jelentkezik, ha a kijelző frissítési frekvenciájánál alacsonyabb képfrissítési sebességet ér el.
Tegyük fel, hogy 60 FPS-t ér el egy 75 Hz-es monitoron – ez azt jelenti, hogy a keretpuffer a frissítési frekvencia 80%-ával frissül. Ha a VSync engedélyezve van, akkor a képkockákat a képfrissítési frekvencia egy részével kell a képernyőpufferbe másolni. Ebben az esetben az alkalmazás minden második ciklusban lekési a “határidőt”, így végül a frissítési sebesség felét kapjuk képfrissítési sebességként: 37,5 FPS. Ez jelentősen kevesebb, mint a grafikus kártyával elérhető 60 FPS.
A TL;DR a dupla pufferes VSync esetében az, hogy ha a frissítési frekvenciánál folyamatosan magasabb FPS-t ér el, akkor jó ötlet lehet a képernyőszakadás csökkentésére, de ha az FPS a kijelző frissítési frekvenciája alá esik, akkor a VSync jelentősen csökkentheti az FPS-t.
Triple Buffering + VSync
Az egész zűrzavar szent grálja általában a tripla pufferelés VSync-kel. A VSync korlátja a dupla puffereléssel az, hogy a framerate jelentősen csökkenhet a másodlagos puffer elsődleges pufferbe való másolásának megfelelő időpontjára való várakozás miatt. A várakozás gyakran nem fantasztikus ötlet az informatikában, ahol ez elkerülhető, ezért itt a megoldás egyszerűen egy másik puffer hozzáadása.
Három puffer esetén a két hátsó pufferre felváltva lehet húzni, így mindig úgy van, hogy az egyik puffer kész, a másik pedig folyamatban van. Ez azt jelenti, hogy közvetlenül egy monitorfrissítés után, amelyik puffer éppen teljes, az átmásolható az elsődleges pufferbe – így a VSync előnyei a korábban tárgyalt framerate-hátrány nélkül biztosíthatók.
A hármas pufferelés fő hátránya, ahol az alkalmazásokban elérhető, az, hogy több memóriát igényel – ha grafikus kártyákról beszélünk, ez több VRAM-ot (Video RAM) jelent. Ez a gyors memória közvetlenül a grafikus kártya által használt memória, és így bizonyos esetekben a tripla pufferelés jelentős FPS-csökkenést okozhat, miközben a magasabb késleltetésű RAM-ot használják a natív VRAM hiányának pótlására. Általában ez nem jelent nagy problémát, mivel a harmadik puffer által elfoglalt memória mennyisége gyakran kicsi a VRAM teljes méretéhez képest, azonban a csak két pufferrel működő VSync néhány nagyon hiányos esetben jobb framerátát biztosíthat! Hintázás és körbe-körbe, mi?