سیگنال VSync خط لوله نمایشگر را همگامسازی میکند. خط لوله نمایشگر شامل رندر کردن برنامه، ترکیب SurfaceFlinger، و ارائه تصاویر در نمایشگر توسط «ترکیبکننده سختافزاری» (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 را غیرفعال میکند تا
از تولید رویدادهای VSync توسط HWC جلوگیری کند. اگر SurfaceFlinger تفاوتی بین VSync واقعی و VSync که قبلاً ایجاد کرده است تشخیص دهد، SurfaceFlinger تولید رویداد VSync را دوباره فعال میکند.
فاصلههای زمانی VSync
برنامه همگامسازی و SurfaceFlinger حلقههای رندر را به سختافزار VSync ارائه میکنند. در رویداد VSync، نمایشگر شروع به نمایش قاب N میکند درحالیکه SurfaceFlinger شروع به ترکیب پنجرهها برای قاب N+1 میکند. برنامه ورودی معلقه را مدیریت میکند و قاب N+2 را تولید میکند.
همگامسازی با VSync تأخیر یکنواختی را ارائه میدهد. این کار باعث کاهش خطا در برنامهها و SurfaceFlinger میشود و نمایشگرهایی را که با یکدیگر همفاز نیستند به حداقل میرساند. این فرض میکند که زمانهای هر فریم برنامه و SurfaceFlinger تفاوت زیادی ندارند. تأخیر حداقل دو قاب است.
برای رفع این مشکل، میتوانید از جبرانکنندههای VSync استفاده کنید تا با نسبی کردن سیگنالهای برنامه و ترکیب نسبتبه VSync سختافزار، تأخیر ورودی به نمایشگر را کاهش دهید. این امر امکانپذیر است زیرا ترکیببندی بهعلاوه برنامه معمولاً کمتر از ۳۳ میلیثانیه طول میکشد.
نتیجه جابهجایی VSync سه سیگنال با دوره و فاز جابهجایی یکسان است:
HW_VSYNC_0— نمایشگر شروع به نشان دادن فریم بعدی میکند.VSYNC— برنامه ورودی را میخواند و قاب بعدی را تولید میکند.SF_VSYNC— SurfaceFlinger ترکیببندی را برای قاب بعدی شروع میکند.
با جابهجاییهای VSync، SurfaceFlinger میانگیر را دریافت میکند و قاب را ترکیب میکند، درحالیکه برنامه بهطور همزمان ورودی را پردازش میکند و قاب را رندر میکند.
DispSync
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 را ممکن میسازد.
تأخیر بیشاز یک یا دو میلیثانیه قابلتوجه است. برای بهحداقل رساندن تأخیر بدون افزایش قابلتوجه تعداد خطاها، آزمایش خطای خودکارسازیشده کامل را ادغام کنید.