VSYNC

سیگنال 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.
  • بازخورد - مهر زمانی سیگنال حصار را از Hardware Composer حذف کنید.

افست 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 را امکان پذیر می کند.

بیش از یک یا دو میلی ثانیه تاخیر قابل توجه است. برای به حداقل رساندن تأخیر بدون افزایش قابل توجه تعداد خطاها، آزمایش خطای خودکار کامل را ادغام کنید.