reinterpretcast

În exemplul de mai sus poate părea inițial că o rată de reîmprospătare de 0,26 Hz și un framerate de 0,2 FPS (Frames Per Second) ar putea fi suficient de apropiate pentru a se afișa corect, însă este clar, urmărind execuția demonstrației, că cele două sunt complet nesincronizate și, prin urmare, screen tearing apare în mod regulat.

Reala problemă cu acest exemplu este că este o „aplicație cu un singur buffer”. Scriem cadrele noastre direct în bufferul care este alimentat către afișaj și, astfel, atunci când afișajul dorește să își reîmprospăteze imaginea, există riscul de a primi un cadru care nu este încă complet terminat. Într-o aplicație reală, framerate-ul se poate schimba adesea în mod dramatic în funcție de anumite circumstanțe, ceea ce poate agrava această problemă în cazul aplicațiilor cu un singur buffer și poate face ca screen tearing-ul să fie și mai imprevizibil.

Double Buffering

O modalitate de a atenua unele dintre aceste probleme este de a folosi double-buffering. Această metodă de desenare constă în scrierea datelor cadrului într-un buffer de rezervă, iar apoi copierea lor în bufferul primar (alimentarea video a ecranului) numai atunci când un cadru este complet. În acest fel, utilizatorul nu va vedea niciodată cadre pe jumătate terminate, nu-i așa? Greșit.

În timp ce screen tearing-ul tinde să fie redus în mod semnificativ în cazul dublului buffer, copierea datelor necesită timp și, ca atare, este foarte posibil ca monitorul să își reîmprospăteze imaginea la jumătatea procesului de copiere a buffer-ului! Această problemă poate fi vizualizată exact ca în cazul tearing-ului cu un singur buffer – în demonstrația anterioară, imaginați-vă că pixelii care sunt scriși în bufferul primar nu sunt generați direct de placa grafică, ci sunt plasați secvențial în buffer ca rezultat al unei operațiuni de copiere dintr-un buffer secundar.

Double Buffering + VSync

O altă tactică de atenuare este utilizarea VSync. Prescurtare de la „vertical synchronisation” (sincronizare verticală), VSync funcționează lăsând doar bufferul secundar să scrie în bufferul primar imediat după ce afișajul a fost reîmprospătat. Se speră ca operațiunea de copiere a bufferului să fie finalizată înainte de următoarea reîmprospătare. Acest lucru funcționează în reducerea dramatică a screen tearing-ului, însă are problemele sale.

Dacă aveți o aplicație cu un framerate ridicat, VSync va funcționa de obicei perfect. Framerate-ul dvs. este limitat la rata de reîmprospătare a monitorului, dar este în regulă, deoarece monitorul dvs. ar afișa oricum la această rată. Problema apare atunci când obțineți un framerate mai mic decât rata de reîmprospătare a afișajului.

Să spunem că obțineați 60 FPS pe un monitor de 75 Hz – asta înseamnă că bufferul de cadre se actualizează la 80% din rata de reîmprospătare. Dacă VSync este activat, cadrele trebuie să fie copiate în bufferul ecranului la o subdiviziune a ratei de reîmprospătare. În acest caz, aplicația va pierde „termenul limită” la fiecare două cicluri, astfel încât vom ajunge la jumătate din rata de reîmprospătare ca framerate: 37,5 FPS. Acest lucru este semnificativ mai mic decât cei 60 FPS pe care îi poate atinge placa grafică.

TLD-ul pentru VSync cu dublu tampon este că, dacă obțineți un FPS constant mai mare decât rata de reîmprospătare, poate fi o idee bună pentru reducerea screen tearing-ului, dar dacă FPS-ul va scădea sub rata de reîmprospătare a ecranului, VSync poate reduce semnificativ FPS-ul.

Triple Buffering + VSync

Sfântul Graal din toată această încurcătură este, de obicei, triple buffering cu VSync. Limita VSync cu tamponare dublă este că framerate-ul poate scădea semnificativ din cauza timpului petrecut așteptând momentul potrivit pentru a copia tamponul secundar în tamponul primar. Așteptarea nu este de multe ori o idee fantastică în informatică atunci când poate fi evitată, așa că o soluție în acest caz este pur și simplu adăugarea unui alt buffer.

Cu trei tampoane, cele două tampoane din spate pot fi atrase alternativ, astfel încât să fie întotdeauna cazul ca un buffer să fie complet și unul să fie în curs. Acest lucru înseamnă că imediat după o reîmprospătare a monitorului, tamponul care este complet în acel moment poate fi copiat în tamponul principal – oferind avantajele VSync fără dezavantajul legat de framerate discutat anterior.

Principalul dezavantaj al bufferului triplu, acolo unde este disponibil în aplicații, este că ocupă mai multă memorie – dacă vorbim despre plăci grafice, aceasta înseamnă mai multă VRAM (Video RAM). Aceasta este memoria rapidă utilizată direct de placa grafică și, prin urmare, în unele cazuri, triple buffering-ul ar putea cauza o scădere semnificativă a FPS-urilor în timp ce este utilizată o memorie RAM cu latență mai mare pentru a compensa lipsa de VRAM nativă. În mod obișnuit, aceasta nu este o problemă uriașă, deoarece cantitatea de memorie ocupată de cel de-al treilea buffer este adesea mică în comparație cu dimensiunea totală a VRAM, însă VSync cu doar două buffere poate oferi un framerate mai bun în unele cazuri foarte de nișă! Schimburi de situație, nu-i așa?

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.