سیگنال VSync خط لوله نمایش را همگام می کند. خط لوله نمایش شامل رندر برنامه، ترکیب SurfaceFlinger و Hardware 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، تأخیر ورودی به نمایش را کاهش دهید. این امکان پذیر است زیرا ترکیب برنامه به علاوه معمولا کمتر از 33 میلی ثانیه طول می کشد.
نتیجه یک افست VSync سه سیگنال با دوره و فاز افست یکسان است:
-
HW_VSYNC_0
- نمایشگر شروع به نمایش فریم بعدی می کند. -
VSYNC
- برنامه ورودی را می خواند و فریم بعدی را تولید می کند. -
SF_VSYNC
- SurfaceFlinger شروع به ترکیب برای فریم بعدی می کند.
با افست های VSync، SurfaceFlinger بافر را دریافت می کند و فریم را ترکیب می کند در حالی که برنامه به طور همزمان ورودی را پردازش کرده و فریم را رندر می کند.
DispSync
DispSync مدلی از رویدادهای دورهای VSync مبتنی بر سختافزار یک نمایشگر را حفظ میکند و از آن مدل برای اجرای تماسهای برگشتی در فازهای خاص از رویدادهای VSync سختافزاری استفاده میکند.
DispSync یک نرمافزار حلقه قفل فاز (PLL) است که سیگنالهای VSYNC
و SF_VSYNC
مورد استفاده توسط Choreographer و SurfaceFlinger را تولید میکند، حتی اگر از VSync سختافزاری خارج نشده باشد.
جریان DispSync در شکل زیر نشان داده شده است:

شکل 1. جریان 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 را امکان پذیر می کند.
بیش از یک یا دو میلی ثانیه تاخیر قابل توجه است. برای به حداقل رساندن تأخیر بدون افزایش قابل توجه تعداد خطاها، آزمایش خطای خودکار کامل را ادغام کنید.