reinterpretcast

W powyższym przykładzie może się początkowo wydawać, że częstotliwość odświeżania 0,26 Hz i framerate 0,2 FPS (Frames Per Second) mogą być wystarczająco zbliżone, aby wyświetlać się poprawnie, jednak wyraźnie widać, oglądając demo, że te dwa elementy są całkowicie niezsynchronizowane i dlatego screen tearing występuje regularnie.

Prawdziwym problemem w tym przykładzie jest to, że jest to „aplikacja z pojedynczym buforem”. Zapisujemy nasze ramki bezpośrednio do bufora, który jest podawany do wyświetlacza, a więc kiedy wyświetlacz chce odświeżyć swój obraz, istnieje ryzyko, że dostanie ramkę, która nie jest jeszcze w pełni ukończona. W prawdziwej aplikacji framerate może często zmieniać się dramatycznie w zależności od pewnych okoliczności, co może pogorszyć ten problem w aplikacjach z pojedynczym buforem i sprawić, że screen tearing będzie jeszcze bardziej nieprzewidywalny.

Podwójne buforowanie

Jednym ze sposobów na złagodzenie niektórych z tych problemów jest użycie podwójnego buforowania. Ta metoda rysowania polega na zapisywaniu danych ramki do bufora tylnego, a następnie kopiowaniu ich do bufora głównego (doprowadzającego obraz do wyświetlacza) tylko wtedy, gdy ramka jest kompletna. W ten sposób użytkownik nigdy nie zobaczy żadnych w połowie ukończonych klatek, prawda? Wrong.

While screen tearing ma tendencję do bycia zredukowanym znacząco z podwójnym buforowaniem, kopiowanie danych zajmuje czas, i jako takie jest całkowicie możliwe, że monitor będzie odświeżał swój obraz w połowie drogi przez proces kopiowania bufora! Problem ten może być zwizualizowany dokładnie tak samo jak w przypadku pojedynczego buforowania – w poprzednim demo, wyobraź sobie, że piksele zapisywane do głównego bufora nie są generowane bezpośrednio przez kartę graficzną, ale zamiast tego są umieszczane w buforze sekwencyjnie w wyniku operacji kopiowania z bufora wtórnego.

Podwójne buforowanie + VSync

Kolejną taktyką łagodzącą jest użycie VSync. Skrót od 'vertical synchronisation’, VSync działa poprzez pozwolenie tylnemu buforowi na zapis do głównego bufora zaraz po odświeżeniu ekranu. Dzięki temu operacja kopiowania bufora powinna być zakończona przed następnym odświeżeniem. Działa to w drastycznym zmniejszeniu rozrywania ekranu, jednak ma swoje problemy.

Jeśli masz aplikację z wysokim framerate, VSync będzie zazwyczaj działać idealnie. Twój framerate jest ograniczony do częstotliwości odświeżania monitora, ale to dobrze, bo monitor i tak będzie wyświetlał z taką częstotliwością. Problem pojawia się, gdy osiągniesz niższy framerate niż częstotliwość odświeżania twojego monitora.

Powiedzmy, że osiągnąłeś 60 FPS na monitorze 75 Hz – oznacza to, że bufor ramki aktualizuje się przy 80% częstotliwości odświeżania. Jeśli włączona jest funkcja VSync, klatki muszą być kopiowane do bufora ekranu z częstotliwością podrzędną w stosunku do częstotliwości odświeżania. W tym przypadku aplikacja przegapi „deadline” w co drugim cyklu, więc skończymy z połową częstotliwości odświeżania jako naszym framerate: 37,5 FPS. Jest to znacznie mniej niż 60 FPS, które karta graficzna może osiągnąć.

TL;DR dla podwójnie buforowanego VSync jest taki, że jeśli osiągasz konsekwentnie wyższy FPS niż częstotliwość odświeżania, może to być dobry pomysł na redukcję rozrywania ekranu, ale jeśli FPS spadnie poniżej częstotliwości odświeżania twojego wyświetlacza, VSync może znacznie zmniejszyć FPS.

Triple Buffering + VSync

Święty Graal tego całego bałaganu to zazwyczaj potrójne buforowanie z VSync. Ograniczeniem VSync z podwójnym buforowaniem jest to, że framerate może znacząco spaść z powodu czasu spędzonego na oczekiwaniu na odpowiedni moment do skopiowania wtórnego bufora do głównego bufora. Czekanie często nie jest fantastycznym pomysłem w informatyce, gdzie można go uniknąć, więc rozwiązaniem tutaj jest po prostu dodanie kolejnego bufora.

Z trzema buforami, dwa tylne bufory mogą być pobierane naprzemiennie, więc zawsze jest tak, że jeden bufor jest kompletny, a jeden w toku. Oznacza to, że zaraz po odświeżeniu monitora, którykolwiek z buforów jest aktualnie kompletny może zostać skopiowany do głównego bufora – zapewniając zalety VSync bez wcześniej omawianej wady framerate.

Główną wadą potrójnego buforowania, gdzie jest ono dostępne w aplikacjach jest to, że zajmuje więcej pamięci – jeśli mówimy o kartach graficznych, oznacza to więcej VRAM (Video RAM). Jest to szybka pamięć używana bezpośrednio przez kartę graficzną, więc w niektórych przypadkach potrójne buforowanie może spowodować znaczny spadek FPS, podczas gdy pamięć RAM o wyższych opóźnieniach jest używana, aby zrekompensować brak natywnej pamięci VRAM. Zazwyczaj nie jest to wielki problem, jako że ilość pamięci zajmowana przez trzeci bufor jest często niewielka w porównaniu do całkowitego rozmiaru VRAM, jednakże VSync z tylko dwoma buforami może zapewnić lepszy framerate w niektórych bardzo niszowych przypadkach! Swings and roundabouts, eh?

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.