VSync (Vertical Synchronization) — GPU-nun hər yeni kadrını ekranın yenilənmə tezliyi ilə sinxronlaşdıran, görüntü qırılmalarını aradan qaldıran texnologiya. Apple Metal Documentation-ya görə, mobil cihazlarda hamar render üçün VBlank ilə sinxronizasiya məcburidir. Screen tearing kadr şaquli yayılma zamanı yeniləndikdə yaranır və VSync bu qarışmanın qarşısını alır.
Əsas məqamlar
VSync (Vertical Synchronization) — GPU-nu yeni kadrı göstərməzdən əvvəl şaquli söndürmə (VBlank) siqnalını gözləməyə məcbur edən aparat-proqram mexanizmi. VSync olmadan GPU kadrları istənilən vaxt göndərə bilər, hətta ekran cari kadrı çəkmə prosesində olduqda belə, bu da üfüqi xətt boyunca görüntünün qırılmasına səbəb olur.
Mobil cihazlarda VSync qrafik sürücü və əməliyyat sistemi səviyyəsində həyata keçirilir. iOS Metal vasitəsilə VBlank sinxronizasiyasından, Android isə SurfaceFlinger və BufferQueue vasitəsilə istifadə edir. Şaquli sinxronizasiya aktiv olduqda proqramın FPS-i ekranın yenilənmə tezliyini keçə bilməz — cihaz modelindən asılı olaraq 60, 90 və ya 120 Hz.
Şaquli sinxronizasiya termini CRT monitorlarının iş mexanizmindən gəlir, burada elektron şüa təsviri yuxarıdan aşağıya sətir-sətir çəkirdi. Kadr tamamlandıqdan sonra şüa yuxarı sol küncə qayıdırdı — bu an şaquli söndürmə adlanırdı. Müasir LCD və OLED displeylər fiziki olaraq fərqli işləsələr də, bu termini qoruyub saxlamışlar.
GPU kadrları back buffer-də render edir, ekran isə front buffer-dən oxuyur. VSync buferlərin dəyişdirilməsinin (swap) yalnız VBlank anında — ekran cari kadrı göstərməyi bitirdikdə və növbətiyə hazır olduqda baş verməsini təmin edir. Bu mexanizm VBlank ilə sinxronizasiya ilə ikiqat buferləşdirmə adlanır.
İkiqat buferləşdirmə iki buferdən istifadə edir: ekranda göstərilən front buffer və GPU-nun cari kadrı yazdığı back buffer. Kadr hazır olduqda buferlər yerlərini dəyişir. VSync aktiv olduqda bu dəyişmə növbəti VBlank-a qədər təxirə salınır. Kadr VBlank-dan əvvəl hazırdırsa, GPU boş dayanır, bu da performansı azaldır, lakin tearingi aradan qaldırır.
// OpenGL — WGL_EXT_swap_control vasitəsilə VSync-in aktivləşdirilməsi
HDC hdc = wglGetCurrentDC();
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT =
reinterpret_cast<PFNWGLSWAPINTERVALEXTPROC>(
wglGetProcAddress("wglSwapIntervalEXT"));
wglSwapIntervalEXT(1); // 1 = VSync aktiv, 0 = deaktiv
VBlank — cari kadrın son sətri ilə növbəti kadrın ilk sətri arasında qısa vaxt intervalı. Bu anda displey pikselləri yeniləmir və buferlərin dəyişdirilməsi artefaktsız baş verir. VBlank müddəti yenilənmə tezliyindən asılıdır: 1080p displeydə 60 Hz-də VBlank təxminən 1.4 ms davam edir. GPU VBlank-dan əvvəl renderi bitirə bilmirsə, kadr atlanır və displey əvvəlki kadrı daha bir dövr göstərir — bu sərtlik (stutter) kimi qəbul edilir.
Üçqat buferləşdirmə üçüncü bufer əlavə edərək GPU boş qalma problemini həll edir. GPU back buffer-lərdən biri VBlank gözləsə belə, növbəti kadrı dərhal render etməyə başlaya bilər. Bu VSync-də FPS-i artırır, lakin əlavə kadr gecikməsi əlavə edir. Mobil cihazlarda üçqat buferləşdirmə bəzi oyun mühərriklərində və Vulkan-da Mailbox rejimi vasitəsilə istifadə olunur.
Söndürülmüş VSync maksimum FPS və minimal input lag verir, lakin vizual artefaktlar bahasına. Mobil oyunlar və hamar animasiyalı proqramlar üçün VSync ilə onu söndürmək arasında seçim görüntü aydınlığı ilə idarəetmə həssaslığı arasında kompromisdir.
Screen tearing — ekranın yuxarı hissəsinin əvvəlki kadrı, aşağı hissəsinin isə növbəti kadrı göstərdiyi üfüqi qırılma. Bu, GPU buferləri ekran yayılma dövrünün ortasında dəyişdikdə baş verir. Mobil cihazlarda tearing sürətli sürüşdürmə və ya yüksək kadr tezliyi olan dinamik səhnələrdə xüsusilə nəzərə çarpır. OLED displeylər ani reaksiya müddəti ilə tearingi LCD ilə müqayisədə daha kontrastlı edir.
Tearing intensivliyi FPS və yenilənmə tezliyi nisbətindən asılıdır. 60 Hz ekranda 60 FPS-də tearing bir statik xətt kimi özünü göstərir, 60 Hz-də 300 FPS-də isə yuxarıdan aşağıya hərəkət edən çoxsaylı dalğavari qırılmalar kimi. Yenilənmə tezliyinə nisbətən FPS nə qədər yüksəkdirsə, qırılmalar bir o qədər çox və nəzərə çarpandır.
Input lag VSync-də — düyməni basmaqla nəticənin ekranda göstərilməsi arasındakı gecikmə. Şaquli sinxronizasiya orta hesabla bir kadr gecikmə əlavə edir (60 Hz-də 16.7 ms), üçqat buferləşdirmədə isə iki kadra qədər. Casual proqramlar üçün bu gecikmə hiss olunmaz, lakin atıcılar, döyüş oyunları və ritm oyunları üçün kritikdir: peşəkarlar hətta 8 ms gecikməni də hiss edir.
NVIDIA (2024) tədqiqatına görə, CS:GO-da 60 FPS-də VSync olmadan orta input lag 22 ms, VSync ilə isə 39 ms təşkil edir. 144 FPS-də fərq müvafiq olaraq 14 vs 18 ms-ə qədər azalır. Mobil platformalarda VSync input lag-ı daha az kritikdir, çünki toxunma girişi səbəbindən sensor ekranın aparat gecikməsi (10–30 ms) sinxronizasiyanın əlavə gecikməsini maskalayır.
Mobil inkişafda VSync qrafik API-lər, oyun mühərrikləri və OS sistem parametrləri vasitəsilə idarə olunur. iOS daha az nəzarət verir, Android — Vulkan və OpenGL ES vasitəsilə daha çox. Rejim seçimi proqram növündən asılıdır: oyunlar, UI və ya video.
Unity QualitySettings.vSyncCount parametrindən istifadə edir: 0 — söndürülmüş, 1 — hər VBlank-da VSync, 2 — hər ikincidə (FPS yarıya düşür). Unreal Engine-də VSync r.VSync konsol əmri və DefaultEngine.ini vasitəsilə idarə olunur. Mobil qurğular üçün Unity-də VSync-i söndürmək və öz FPS məhdudlaşdırıcısından istifadə etmək tövsiyə olunur, çünki Android SurfaceFlinger-də quraşdırılmış VSync gözlənilməz gecikmələr yarada bilər.
// Unity — VSync və FPS idarəsi
void Awake()
{
// 0 = VSync deaktiv, 1 = VSync aktiv
QualitySettings.vSyncCount = 0;
// VSync əvəzinə öz FPS məhdudlaşdırıcısı
Application.targetFrameRate = 60;
}
Vulkan VkSwapchainPresentInfo və presentMode vasitəsilə tam nəzarət verir: VK_PRESENT_MODE_FIFO_KHR — klassik VSync, VK_PRESENT_MODE_MAILBOX_KHR — gözləməsiz üçqat buferləşdirmə, VK_PRESENT_MODE_IMMEDIATE_KHR — sinxronizasiyasız. iOS-da Metal VSync-i CAMetalLayer.displaySyncEnabled vasitəsilə idarə edir. iOS 14-dən etibarən Apple arkada idarəsi olan oyunlar istisna olmaqla, bütün proqramlar üçün displaySyncEnabled = true-dan istifadə etməyi tövsiyə edir.
| Rejim | İzah | Gecikmə |
|---|---|---|
| FIFO | VBlank gözləməsi ilə klassik VSync | 1 kadr |
| Mailbox | Üçqat buferləşdirmə, köhnə kadrların atılması | 1–2 kadr |
| Immediate | Sinxronizasiyasız, maksimum FPS | 0 kadr |
FPS məhdudlaşdırıcısı — VSync-ə alternativdir, burada proqram VBlank gözləmədən kadr tezliyini proqram təminatı ilə məhdudlaşdırır. Bu yanaşma proqnozlaşdırıla bilən gecikmə verir və ekranın yenilənmə tezliyindən asılı deyil. Android-də FPS məhdudlaşdırılması Choreographer vasitəsilə, iOS-da isə çıxış vaxtının əl ilə idarə edilməsi ilə CADisplayLink vasitəsilə həyata keçirilir.
Ənənəvi VSync fundamental bir çatışmazlığa malikdir: o, ekranın sabit yenilənmə tezliyinə bağlıdır. GPU 60 Hz ekranda 45 FPS verirsə, VSync 45 kadr göstərə bilməz — ya 30 göstərir (hər ikinci VBlank-ı atlayaraq), ya da qeyri-bərabər intervallarla 60 və 30 arasında dəyişir. Bu, sərtlik (stutter) yaradır ki, bu da oyun təəssüratını tearingdən daha çox korlayır.
Adaptive Sync (FreeSync, G-Sync, Apple ProMotion) bu problemi həll edir, ekranın yenilənmə tezliyini proqramın FPS-i ilə uyğun olaraq dinamik dəyişdirir. Proqram 47 FPS verirsə, displey 47 Hz-ə keçir — hər kadr dəfələrlə, qırılma və sərtlik olmadan göstərilir. iOS-da ProMotion hamarlıq və enerji istehlakı arasında tarazlıq yaradaraq avtomatik olaraq 24-dən 120 Hz-ə qədər tezlik seçir.
Mobil cihazlarda Adaptive Sync standart halına gəlir: ProMotion ilə iPad Pro (2017+), LTPO displeyləri olan Android flaqmanları (Samsung Galaxy S23 Ultra, Google Pixel 8 Pro) 1-dən 120 Hz-ə qədər dinamik yenilənmə tezliyini dəstəkləyir. Tərtibatçı üçün bu o deməkdir ki, ənənəvi mənada VSync sistem idarəçiliyi ilə əvəz olunur — sadəcə targetFrameRate təyin etmək kifayətdir, OS isə hamarlıq və batareya ömrünün optimal balansı üçün yenilənmə tezliyini özü tənzimləyəcək.
Tez-tez verilən suallar
Xeyr. Dinamik oyunlarda (atıcılar, döyüş oyunları) VSync input lag-ı artırır, əhəmiyyətli fayda vermir — mobil OLED ekranlarda tearing ekranın kiçik ölçüsü səbəbindən daha az nəzərə çarpır. Casual oyunlar və UI üçün VSync hamarlıq qavrayışını yaxşılaşdırır.
VSync enerji istehlakını azaldır, çünki GPU lazımsız kadrları render etmir. VSync söndürüldükdə GPU maksimum tezlikdə işləyir və hər göstərilməyən kadr enerji sərf edir və cihazı istifadəçiyə fayda vermədən qızdırır.
VSync kadr çıxışını ekranın VBlank ilə sinxronlaşdırır, FPS məhdudlaşdırıcısı isə sadəcə proqram kodunda render tezliyini məhdudlaşdırır. FPS məhdudlaşdırıcısı tearingi aradan qaldırmır, lakin ekranın tezliyinə bağlı olmadan proqnozlaşdırıla bilən gecikmə verir.
GPU VBlank-dan əvvəl kadrı tamamlaya bilmədikdə, VBlank atlanır və kadr iki yenilənmə dövrü göstərilir. 60 Hz-də bu 30 FPS verir. Üçqat buferləşdirmə bu effekti yumşaldır, GPU-ya gözləmədən növbəti kadra başlamağa imkan verir.
Bəli. iOS ProMotion (iPad Pro, iPhone 13 Pro+) 24–120 Hz dinamik tezliyi dəstəkləyir. Android LTPO panelləri vasitəsilə 1–120 Hz dəstəkləyir. Tərtibatçı bunu əl ilə idarə etməlidir — sistem optimal tezliyi avtomatik seçir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun