VSync (Vertical Synchronization) — فناوری که هر فریم جدید GPU را با نرخ تازهسازی نمایشگر همگامسازی میکند و پارگی تصویر را از بین میبرد. طبق Apple Metal Documentation، همگامسازی با VBlank برای رندر روان در دستگاههای موبایل ضروری است. Screen tearing زمانی رخ میدهد که فریم در طی پویش عمودی بهروزرسانی میشود و VSync از این ترکیب جلوگیری میکند.
نکات اصلی
VSync (Vertical Synchronization) — مکانیسم سختافزاری-نرمافزاری است که GPU را مجبور میکند قبل از نمایش فریم جدید منتظر سیگنال محو شدن عمودی (VBlank) بماند. بدون VSync، GPU میتواند فریمها را در هر زمانی ارسال کند، حتی زمانی که نمایشگر در حال رندر کردن فریم فعلی است، که منجر به پارگی تصویر در امتداد یک خط افقی میشود.
در دستگاههای موبایل، VSync در سطح درایور گرافیکی و سیستم عامل پیادهسازی شده است. iOS از همگامسازی VBlank از طریق Metal استفاده میکند، Android از طریق SurfaceFlinger و BufferQueue. هنگامی که همگامسازی عمودی فعال است، FPS برنامه نمیتواند از نرخ تازهسازی نمایشگر تجاوز کند — 60، 90 یا 120 هرتز بسته به مدل دستگاه.
اصطلاح همگامسازی عمودی از مکانیسم کار مانیتورهای CRT گرفته شده است، جایی که پرتو الکترون تصویر را خط به خط از بالا به پایین میکشید. پس از اتمام فریم، پرتو به گوشه بالا چپ بازمیگشت — این لحظه محو شدن عمودی نامیده میشد. نمایشگرهای مدرن LCD و OLED این اصطلاح را حفظ کردهاند، اگرچه فیزیکی متفاوت کار میکنند.
GPU فریمها را در back buffer رندر میکند و نمایشگر از front buffer میخواند. VSync تضمین میکند که تعویض بافرها (swap) فقط در لحظه VBlank رخ میدهد — زمانی که نمایشگر نمایش فریم فعلی را به پایان رسانده و برای فریم بعدی آماده است. این مکانیسم بافر دوگانه با همگامسازی از طریق VBlank نامیده میشود.
بافر دوگانه از دو بافر استفاده میکند: front buffer که روی صفحه نمایش داده میشود و back buffer که GPU فریم فعلی را در آن مینویسد. وقتی فریم آماده شد، بافرها جا به جا میشوند. با VSync فعال، این تعویض تا نزدیکترین VBlank به تأخیر میافتد. اگر فریم زودتر از VBlank آماده باشد، GPU بیکار میماند که عملکرد را کاهش میدهد اما tearing را از بین میبرد.
// OpenGL — فعالسازی VSync از طریق WGL_EXT_swap_control
HDC hdc = wglGetCurrentDC();
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT =
reinterpret_cast<PFNWGLSWAPINTERVALEXTPROC>(
wglGetProcAddress("wglSwapIntervalEXT"));
wglSwapIntervalEXT(1); // 1 = VSync فعال، 0 = غیرفعال
VBlank — فاصله کوتاه بین آخرین خط فریم فعلی و اولین خط فریم بعدی. در این لحظه نمایشگر پیکسلها را بهروزرسانی نمیکند و تعویض بافرها بدون مصنوع انجام میشود. مدت VBlank به نرخ تازهسازی بستگی دارد: در 60 هرتز روی نمایشگر 1080p، VBlank حدود 1.4 ms طول میکشد. اگر GPU نتواند رندر را قبل از VBlank کامل کند، فریم رد میشود و نمایشگر فریم قبلی را برای یک چرخه دیگر نشان میدهد — این به عنوان لکنت (stutter) درک میشود.
بافر سهگانه مشکل بیکاری GPU را با افزودن بافر سوم حل میکند. GPU میتواند رندر فریم بعدی را بلافاصله شروع کند، حتی اگر یکی از back bufferها منتظر VBlank باشد. این کار FPS را در VSync افزایش میدهد اما یک فریم تأخیر اضافی اضافه میکند. در دستگاههای موبایل، بافر سهگانه در برخی موتورهای بازی و در Vulkan از طریق حالت Mailbox استفاده میشود.
VSync خاموش حداکثر FPS و حداقل input lag را میدهد، اما به قیمت مصنوعات بصری. برای بازیهای موبایل و برنامههای با انیمیشن روان، انتخاب بین VSync و خاموش کردن آن مصالحهای بین وضوح تصویر و پاسخگویی کنترل است.
Screen tearing — پارگی افقی که در آن قسمت بالای صفحه فریم قبلی و قسمت پایین فریم بعدی را نشان میدهد. این زمانی رخ میدهد که GPU بافرها را در وسط چرخه پویش نمایشگر تغییر میدهد. در دستگاههای موبایل، tearing به ویژه در اسکرول سریع یا صحنههای پویا با نرخ فریم بالا قابل توجه است. نمایشگرهای OLED با پاسخ فوری خود، tearing را در مقایسه با LCD کنتراستیتر میکنند.
شدت tearing به نسبت FPS به نرخ تازهسازی بستگی دارد. در 60 FPS روی صفحه 60 هرتز، tearing به صورت یک خط ایستا ظاهر میشود و در 300 FPS روی 60 هرتز — به صورت پارگیهای موجی متعدد که از بالا به پایین حرکت میکنند. هرچه FPS نسبت به نرخ تازهسازی بالاتر باشد، پارگیها بیشتر و قابل توجهتر هستند.
Input lag در VSync — تأخیر بین فشار دادن دکمه و نمایش نتیجه روی صفحه است. همگامسازی عمودی به طور متوسط یک فریم تأخیر اضافه میکند (16.7 ms در 60 هرتز) و با بافر سهگانه — تا دو فریم. برای برنامههای معمولی این تأخیر نامحسوس است، اما برای تیراندازیها، بازیهای مبارزهای و بازیهای ریتم بحرانی است: حرفهایها حتی تأخیر 8 ms را هم متوجه میشوند.
طبق تحقیقات NVIDIA (2024)، میانگین input lag در CS:GO در 60 FPS بدون VSync 22 ms و با VSync 39 ms است. در 144 FPS تفاوت به ترتیب به 14 vs 18 ms کاهش مییابد. در پلتفرمهای موبایل، input lag VSync کمتر بحرانی است زیرا ورودی لمسی با تأخیر سختافزاری تاچاسکرین (10–30 ms) تأخیر اضافی همگامسازی را میپوشاند.
در توسعه موبایل، VSync از طریق APIهای گرافیکی، موتورهای بازی و تنظیمات سیستم عامل مدیریت میشود. iOS کنترل کمتری ارائه میدهد، Android بیشتر از طریق Vulkan و OpenGL ES. انتخاب حالت به نوع برنامه بستگی دارد: بازی، UI یا ویدیو.
Unity از تنظیم QualitySettings.vSyncCount استفاده میکند: 0 — خاموش، 1 — VSync در هر VBlank، 2 — در هر دومین (FPS نصف میشود). در Unreal Engine، VSync از طریق دستور کنسول r.VSync و DefaultEngine.ini مدیریت میشود. برای بیلدهای موبایل توصیه میشود VSync را در Unity خاموش کرده و از محدودکننده FPS شخصی استفاده کنید، زیرا VSync داخلی در Android SurfaceFlinger میتواند تأخیرهای غیرقابل پیشبینی ایجاد کند.
// Unity — مدیریت VSync و FPS
void Awake()
{
// 0 = VSync غیرفعال، 1 = VSync فعال
QualitySettings.vSyncCount = 0;
// محدودکننده FPS شخصی به جای VSync
Application.targetFrameRate = 60;
}
Vulkan کنترل کامل را از طریق VkSwapchainPresentInfo و presentMode ارائه میدهد: VK_PRESENT_MODE_FIFO_KHR — VSync کلاسیک، VK_PRESENT_MODE_MAILBOX_KHR — بافر سهگانه بدون انتظار، VK_PRESENT_MODE_IMMEDIATE_KHR — بدون همگامسازی. Metal در iOS VSync را از طریق CAMetalLayer.displaySyncEnabled مدیریت میکند. از iOS 14، Apple توصیه میکند به طور پیشفرض از displaySyncEnabled = true برای همه برنامهها به جز بازیهای با کنترل آرکید استفاده کنید.
| حالت | توضیح | تأخیر |
|---|---|---|
| FIFO | VSync کلاسیک با انتظار VBlank | 1 فریم |
| Mailbox | بافر سهگانه، حذف فریمهای قدیمی | 1–2 فریم |
| Immediate | بدون همگامسازی، حداکثر FPS | 0 فریم |
محدودکننده FPS — جایگزینی برای VSync که در آن برنامه به صورت نرمافزاری نرخ فریم را محدود میکند بدون انتظار برای VBlank. این رویکرد تأخیر قابل پیشبینی میدهد و به نرخ تازهسازی نمایشگر وابسته نیست. در Android، محدود کردن FPS از طریق Choreographer و در iOS از طریق CADisplayLink با کنترل دستی زمان خروجی انجام میشود.
VSync سنتی یک نقص اساسی دارد: به نرخ تازهسازی ثابت نمایشگر وابسته است. اگر GPU 45 FPS در صفحه 60 هرتز تولید کند، VSync نمیتواند 45 فریم را نشان دهد — یا 30 را نشان میدهد (با رد هر دومین VBlank) یا بین 60 و 30 با فواصل نامنظم تغییر میکند. این لکنت (stutter) ایجاد میکند که تجربه بازی را بیشتر از tearing خراب میکند.
Adaptive Sync (FreeSync, G-Sync, Apple ProMotion) این مشکل را با تغییر پویای نرخ تازهسازی نمایشگر مطابق با FPS برنامه حل میکند. اگر برنامه 47 FPS تولید کند، نمایشگر به 47 هرتز تغییر میکند — هر فریم دقیقاً یک بار، بدون پارگی و لکنت نمایش داده میشود. ProMotion در iOS به طور خودکار فرکانس 24 تا 120 هرتز را انتخاب میکند و بین روانی و مصرف انرژی تعادل برقرار میکند.
در دستگاههای موبایل، Adaptive Sync به استاندارد تبدیل میشود: iPad Pro (2017+) با ProMotion، پرچمداران Android با نمایشگرهای LTPO (Samsung Galaxy S23 Ultra, Google Pixel 8 Pro) از نرخ تازهسازی پویا از 1 تا 120 هرتز پشتیبانی میکنند. برای توسعهدهنده این به معنای آن است که VSync به معنای سنتی با مدیریت سیستم جایگزین میشود — کافی است targetFrameRate تنظیم کنید و سیستم خودش نرخ تازهسازی را برای تعادل بهینه روانی و عمر باتری تنظیم میکند.
سوالات متداول
خیر. در بازیهای پویا (تیراندازی، مبارزهای) VSync input lag را بدون سود قابل توجه افزایش میدهد — tearing در نمایشگرهای OLED موبایل به دلیل اندازه کوچک صفحه کمتر قابل توجه است. برای بازیهای معمولی و UI، VSync درک روانی را بهبود میبخشد.
VSync مصرف انرژی را کاهش میدهد زیرا GPU فریمهای اضافی رندر نمیکند. با VSync خاموش، GPU با حداکثر فرکانس کار میکند و هر فریم نمایش داده نشده انرژی مصرف میکند و دستگاه را بدون فایده برای کاربر گرم میکند.
VSync خروجی فریمها را با VBlank نمایشگر همگامسازی میکند، در حالی که محدودکننده FPS صرفاً نرخ رندر را در کد برنامه محدود میکند. محدودکننده FPS tearing را حذف نمیکند اما تأخیر قابل پیشبینی بدون وابستگی به نرخ تازهسازی صفحه میدهد.
وقتی GPU نتواند فریم را قبل از VBlank کامل کند، VBlank رد میشود و فریم برای دو چرخه تازهسازی نمایش داده میشود. در 60 هرتز این 30 FPS میدهد. بافر سهگانه این اثر را کاهش میدهد و به GPU اجازه میدهد فریم بعدی را بدون انتظار شروع کند.
بله. iOS ProMotion (iPad Pro, iPhone 13 Pro+) از فرکانس پویا 24–120 هرتز پشتیبانی میکند. Android از طریق پنلهای LTPO از 1–120 هرتز پشتیبانی میکند. توسعهدهنده نیازی به مدیریت دستی این ندارد — سیستم فرکانس بهینه را به طور خودکار انتخاب میکند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید