120fps — częstotliwość 120 klatek na sekundę, dostępna na wyświetlaczach z odświeżaniem 120 Hz, gdzie każda klatka zajmuje 8.3 ms. Według Apple WWDC 2023 Session, ProMotion automatycznie przełącza częstotliwość od 24 do 120 Hz dla równowagi płynności i zużycia energii. 8.3 ms — to dwa razy mniej niż standardowy budżet, co wymaga poważnej optymalizacji renderowania.
Najważniejsze
120fps — podwojona względem standardu częstotliwość klatek, przy której wyświetlacz odświeża obraz 120 razy na sekundę. Każda klatka ma budżet czasu 8.33 ms — dwa razy mniej niż przy 60fps. Oznacza to, że GPU i CPU muszą przetwarzać grafikę dwa razy szybciej, a wszystkie algorytmy działające w 16.7 ms przy 120fps mieszczą się tylko pod warunkiem dwukrotnie większej wydajności.
Pierwszym urządzeniem mobilnym z wyświetlaczem 120 Hz był Razer Phone (2017) z panelem IGZO firmy Sharp. Apple wprowadziło 120 Hz w iPad Pro (2017) pod nazwą ProMotion, a w iPhone — dopiero w 2021 roku w iPhone 13 Pro. W Androidzie 120 Hz stało się masowe od 2020 roku: Samsung Galaxy S20, OnePlus 8 Pro, Xiaomi Mi 10. Obecnie 90–120 Hz to standard dla flagowych urządzeń, a technologia LTPO pozwala dynamicznie zmieniać częstotliwość.
Postrzeganie 120fps przez użytkownika różni się od 60fps nie tyle brakiem zacięć, co odczuciem natychmiastowej reakcji — kursor, przewijanie, animacje podążają za palcem z minimalnym opóźnieniem. To odczucie często opisywane jest jako „płynny" lub „oleisty" ekran. Po używaniu 120 Hz powrót do 60 Hz subiektywnie odbierany jest jako przycięcia, nawet jeśli obiektywnie nie ma pomijania klatek.
Wyświetlacz 120 Hz fizycznie odświeża piksele 120 razy na sekundę, wysyłając sygnał magistralą MIPI DSI/DPI z podwojoną częstotliwością. Każdy piksel otrzymuje nową wartość jasności co 8.3 ms. Dla paneli OLED oznacza to, że czas emisji każdego subpiksela ulega skróceniu, co wymaga jaśniejszego podświetlenia, aby zachować tę samą jasność obrazu.
LTPO (Low-Temperature Polycrystalline Oxide) — technologia produkcji wyświetlaczy OLED, łącząca LTPS (wysoka szybkość przełączania) i IGZO (niskie zużycie energii w stanie spoczynku). LTPO pozwala wyświetlaczowi dynamicznie zmieniać częstotliwość odświeżania od 1 do 120 Hz bez dodatkowych strat energii. W trybie Always-On Display częstotliwość spada do 1 Hz, przy przewijaniu — wzrasta do 120 Hz. Daje to oszczędność do 30% energii w porównaniu z wyświetlaczami pracującymi stale na 120 Hz.
Frame pacing — równomierność odstępów między klatkami, najważniejszy parametr przy 120fps. Jeśli przy 60fps różnica między klatkami rzędu 2–3 ms jest niezauważalna, to przy 120fps ta sama różnica bezwzględna stanowi 25% czasu trwania klatki i odbierana jest jako zacinanie. Dla płynnych 120fps każda klatka musi mieścić się w 8.3 ms ±1 ms. Narzędzia takie jak FrameRate w Xcode Instruments pokazują nie tylko średnie FPS, ale także histogram odstępów do oceny frame pacing.
// iOS — wykrywanie wyświetlacza 120 Hz przez CADisplayLink
func checkDisplayRefreshRate() {
let link = CADisplayLink(target: self,
selector: #selector(step))
if let preferredRate = link?.preferredFrameRateRange {
print("Maks. częstotliwość: \("preferredRate.maximum) Hz")
}
}
ProMotion — znak towarowy Apple dla wyświetlaczy z adaptacyjną częstotliwością odświeżania do 120 Hz. Po raz pierwszy przedstawiony w iPad Pro 10.5 (2017), następnie pojawił się w iPhone 13 Pro (2021) i MacBook Pro (2021). ProMotion to nie tylko 120 Hz — to inteligentne zarządzanie częstotliwością: system analizuje typ treści i przełącza częstotliwość dla optymalnej równowagi wydajności i zużycia energii.
ProMotion obsługuje cztery tryby: 24 Hz dla statycznych treści i wideo 24fps, 30 Hz dla wideo 30fps, 60 Hz dla nawigacji UI i 120 Hz dla przewijania i gier. Przełączanie między trybami odbywa się w ciągu jednej klatki (8.3 ms) i jest niezauważalne dla użytkownika. Deweloper może wpłynąć na wybór częstotliwości przez preferredFrameRateRange w CADisplayLink, ale ostateczną decyzję podejmuje system na podstawie analizy treści.
Apple udostępnia API do pracy z ProMotion począwszy od iOS 15. CADisplayLink.preferredFrameRateRange pozwala ustawić preferowany zakres częstotliwości. UIScene.ActivationConditions może wpływać na częstotliwość przy przejściach między scenami. Dla renderowania Metal CAMetalLayer.displaySyncEnabled musi być true do synchronizacji z ProMotion. Jeśli aplikacja nie jest zoptymalizowana pod 120fps, iOS automatycznie przełącza ją na 60 Hz, co widać w Xcode w sekcji GPU Report.
// iOS — żądanie 120fps dla trybu gry
let displayLink = CADisplayLink(
target: self,
selector: #selector(gameLoop)
)
if #available(iOS 15.0, *) {
displayLink?.preferredFrameRateRange =
CAFrameRateRange(minimum: 80,
maximum: 120,
preferred: 120)
}
displayLink?.add(to: .current,
forMode: .default)
Optymalizacja pod 120fps — to nie tylko przyspieszenie kodu dwukrotnie, ale przemyślenie architektury renderowania. Operacje, które mieściły się w 16.7 ms przy 60fps, teraz muszą być wykonywane w 8.3 ms. Dotyczy to wszystkich etapów potoku: przygotowania CPU, renderowania GPU i wywołań systemowych.
Przy 120fps liczba draw calls na klatkę musi być dwa razy mniejsza niż przy 60fps, aby zachować to samo obciążenie GPU. Jeśli przy 60fps dopuszczalne jest 400 draw calls, to przy 120fps — nie więcej niż 200. Używaj atlasów tekstur, łączenia meshy i GPU-instancingu do zmniejszenia wywołań rysowania. W Metalu używaj Indirect Command Buffers, w Vulkanie — Secondary Command Buffers do równoległego zapisu komend.
Shadery — kolejny krytyczny czynnik. Złożone shadery pikselowe z wieloma próbkowaniami tekstur i operacjami matematycznymi mogą łatwo przekroczyć budżet 8.3 ms. Używaj shaderów o niskiej precyzji (half zamiast float), zmniejszaj liczbę instrukcji i próbek tekstur. Na mobilnych GPU (Apple A17, Snapdragon 8 Gen 3) każde próbkowanie tekstury zajmuje 2–4 cykle, a przy 120fps może to stać się wąskim gardłem.
Przy 120fps main thread musi przygotować klatkę w 4–5 ms, aby zostawić czas GPU na renderowanie. Każda synchroniczna operacja na main thread — odczyt z bazy danych, parsowanie JSON, ładowanie obrazów — powoduje zacinanie. Przenoś wszystkie ciężkie operacje do wątków tła, używaj asynchronicznych API i puli wątków. W iOS DispatchQueue z qualityOfService .userInteractive powinno być zarezerwowane tylko dla krytycznego kodu renderowania.
| Komponent | Budżet 120fps | Budżet 60fps |
|---|---|---|
| CPU (main thread) | 4 ms | 8 ms |
| Renderowanie GPU | 4 ms | 8 ms |
| Kompozyt | 0.3 ms | 0.7 ms |
| Oczekiwanie VSync | 0–2 ms | 0–5 ms |
Porównanie 120fps i 60fps nie sprowadza się do podwojenia płynności. Różnica jest odbierana różnie w zależności od typu treści. Dla przewijania i animacji UI 120fps daje subiektywnie bardziej „responsywny" interfejs. Dla gier przewaga 120fps przejawia się w zmniejszeniu rozmycia ruchu i dokładniejszym śledzeniu szybkich obiektów.
Zużycie energii — główny kompromis. 120fps zużywa o 30–50% więcej energii niż 60fps przy tej samej jasności wyświetlacza. Oznacza to, że na baterii 4000 mAh godzina gry w 120fps rozładowuje baterię około 25–30% szybciej. Wyświetlacze LTPO częściowo rozwiązują problem, zmniejszając częstotliwość w statycznych scenach do 1 Hz, ale przy aktywnym użytkowaniu (przewijanie, gry) częstotliwość pozostaje na maksimum.
Wybór między 60fps a 120fps zależy od priorytetów dewelopera. Dla portali społecznościowych, komunikatorów i aplikacji informacyjnych 120fps nie daje znaczącej przewagi — podstawowa interakcja (czytanie, wprowadzanie tekstu) nie zyskuje na superpłynności. Dla gier, map, edytorów graficznych i aplikacji z intensywną animacją 120fps staje się przewagą konkurencyjną i wyznacznikiem jakości.
Testowanie 120fps wymaga specjalnego podejścia: standardowe metryki 60fps nie pokazują problemów frame pacing przy 120 Hz. Używaj kamery wysokiej prędkości (120+ fps) do nagrywania rzeczywistego zachowania ekranu lub wbudowanych narzędzi platformy — Xcode Metal Capture dla iOS i AGI (Android GPU Inspector) dla Androida. Te narzędzia pokazują dokładny czas każdej klatki, włącznie z oczekiwaniem VSync, i pomagają wykryć mikro-zacinania.
Często zadawane pytania
Nie zawsze. 120fps wymaga dwa razy więcej energii i zasobów obliczeniowych. Dla statycznych treści i prostego UI 60fps wystarcza. Przewaga 120fps jest zauważalna w dynamicznych scenach: przewijanie, gry, animacje przejść.
Używaj Xcode Instruments (szablon Core Animation) lub Android Studio Profiler. W iOS sprawdź CADisplayLink.timestamp — odstęp między wywołaniami powinien wynosić około 8.3 ms. W Androidzie włącz Show refresh rate w Developer Options.
Wyświetlacz odświeża piksele dwa razy częściej, GPU wykonuje dwukrotnie więcej operacji renderowania, CPU przetwarza dwukrotnie więcej klatek. Każda operacja zużywa energię. Wyświetlacze LTPO zmniejszają częstotliwość w spoczynku, ale przy aktywnym użytkowaniu zużycie energii rośnie proporcjonalnie do częstotliwości.
Tak. Począwszy od Androida 11, system obsługuje różne częstotliwości odświeżania. Deweloper może zażądać 120 Hz przez WindowManager.setPreferredRefreshRate. Jednak nie wszystkie urządzenia stabilnie utrzymują 120fps — konieczna jest optymalizacja renderowania GPU.
W ślepym teście większość użytkowników zauważa różnicę przy przewijaniu i animacjach. Jednak do zwykłego użytkowania (media społecznościowe, wideo, komunikatory) różnica jest subiektywnie niewielka. Po przyzwyczajeniu do 120 Hz powrót do 60 Hz odczuwany jest jako przycięcia.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również