سیگنال VSync، خط لوله نمایش را همگامسازی میکند. خط لوله نمایش شامل رندر برنامه، ترکیب SurfaceFlinger و Composer سختافزاری (HWC) است که تصاویر را روی صفحه نمایش ارائه میدهد. VSync زمان بیدار شدن برنامهها برای شروع رندر، زمان بیدار شدن SurfaceFlinger برای ترکیب صفحه نمایش و چرخه تازهسازی صفحه نمایش را هماهنگ میکند. این همگامسازی، وقفهها را از بین میبرد و عملکرد بصری گرافیک را بهبود میبخشد.
HWC رویدادهای VSync را تولید میکند و رویدادها را از طریق callback به SurfaceFlinger ارسال میکند:
typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData, hwc2_display_t display, int64_t timestamp);
SurfaceFlinger با فراخوانی setVsyncEnabled
کنترل میکند که آیا HWC رویدادهای VSync تولید کند یا خیر. SurfaceFlinger، setVsyncEnabled
فعال میکند تا رویدادهای VSync تولید کند تا بتواند با چرخه تازهسازی صفحه نمایش همگامسازی شود. هنگامی که SurfaceFlinger با چرخه تازهسازی صفحه نمایش همگامسازی میشود، SurfaceFlinger setVsyncEnabled
غیرفعال میکند تا HWC از تولید رویدادهای VSync جلوگیری کند. اگر SurfaceFlinger تفاوتی بین VSync واقعی و VSync که قبلاً ایجاد کرده است، تشخیص دهد، SurfaceFlinger دوباره تولید رویداد VSync را فعال میکند.
جبرانهای VSync
برنامه همگامسازی و رندر SurfaceFlinger به صورت حلقهای به VSync سختافزاری متصل میشوند. در یک رویداد VSync، صفحه نمایش شروع به نمایش فریم N میکند در حالی که SurfaceFlinger شروع به ترکیب پنجرهها برای فریم N+1 میکند. برنامه ورودیهای در حال انتظار را مدیریت کرده و فریم N+2 را تولید میکند.
همگامسازی با VSync تأخیر ثابتی را ارائه میدهد. این امر خطاها را در برنامهها و SurfaceFlinger کاهش میدهد و اختلاف فاز نمایشگرها با یکدیگر را به حداقل میرساند. این فرض را در نظر میگیرد که زمان فریم برنامه و SurfaceFlinger تفاوت زیادی نداشته باشد. تأخیر حداقل دو فریم است.
برای رفع این مشکل، میتوانید از VSync offsets برای کاهش تأخیر ورودی به نمایشگر استفاده کنید. این کار با تنظیم سیگنالهای برنامه و ترکیب نسبت به VSync سختافزار انجام میشود. این امر به این دلیل امکانپذیر است که ترکیب برنامه و ترکیب معمولاً کمتر از ۳۳ میلیثانیه طول میکشد.
نتیجهی یک آفست VSync، سه سیگنال با دوره تناوب و فاز آفست یکسان است:
-
HW_VSYNC_0
— نمایشگر شروع به نمایش فریم بعدی میکند. -
VSYNC
- برنامه ورودی را میخواند و فریم بعدی را تولید میکند. -
SF_VSYNC
— SurfaceFlinger شروع به ترکیب فریم بعدی میکند.
با استفاده از VSync offsets، SurfaceFlinger بافر را دریافت کرده و فریم را کامپوزیت میکند، در حالی که برنامه همزمان ورودی را پردازش کرده و فریم را رندر میکند.
همگامسازی
DispSync مدلی از رویدادهای VSync مبتنی بر سختافزار دورهای یک نمایشگر را نگهداری میکند و از آن مدل برای اجرای فراخوانیها در فواصل فاز خاص از رویدادهای VSync سختافزاری استفاده میکند.
DispSync یک حلقه قفل فاز (PLL) نرمافزاری است که سیگنالهای VSYNC
و SF_VSYNC
مورد استفاده Choreographer و SurfaceFlinger را تولید میکند، حتی اگر از VSync سختافزاری جبران نشده باشد.
جریان DispSync در شکل زیر نشان داده شده است:

شکل ۱. جریان DispSync.
DispSync دارای ویژگیهای زیر است:
- مرجع —
HW_VSYNC_0
. - خروجی —
VSYNC
وSF_VSYNC
. - بازخورد — مهرهای زمانی سیگنال حصار را از HWC حذف کنید.
آفستهای بازنشستگی VSync
مهر زمانی سیگنال حصارهای کنار گذاشته شده باید با HW VSync مطابقت داشته باشد، حتی در دستگاههایی که از فاز آفست استفاده نمیکنند. در غیر این صورت، خطاها شدیدتر از آنچه هستند به نظر میرسند. پنلهای هوشمند اغلب دارای دلتا هستند که در آن حصار کنار گذاشته شده پایان دسترسی مستقیم به حافظه (DMA) برای نمایش حافظه است، اما سوئیچ واقعی صفحه نمایش و HW VSync مدتی بعد اتفاق میافتد.
PRESENT_TIME_OFFSET_FROM_VSYNC_NS
در فایل ساخت BoardConfig.mk
دستگاه تنظیم شده است. این فایل بر اساس مشخصات کنترلر صفحه نمایش و پنل تنظیم میشود. زمان از زمان خاموش شدن حصار تا سیگنال HW VSync بر حسب نانوثانیه اندازهگیری میشود.
آفستهای VSYNC و SF_VSYNC
VSYNC_EVENT_PHASE_OFFSET_NS
و SF_VSYNC_EVENT_PHASE_OFFSET_NS
به صورت محافظهکارانه و بر اساس موارد استفاده با بار زیاد، مانند ترکیب جزئی GPU در حین انتقال پنجره یا پیمایش Chrome در یک صفحه وب حاوی انیمیشن، تنظیم میشوند. این مقادیر امکان زمان رندر طولانی برنامه و زمان ترکیب طولانی GPU را فراهم میکنند.
بیش از یک یا دو میلیثانیه تأخیر قابل توجه است. برای به حداقل رساندن تأخیر بدون افزایش قابل توجه تعداد خطاها، تست خطای خودکار کامل را ادغام کنید.