VSync

تعمل إشارة VSync على مزامنة مسار العرض. تتألف سلسلة عرض الشاشة من عرض التطبيق، وتركيب SurfaceFlinger، وعرض Hardware Composer (HWC) للصور على الشاشة. تعمل VSync على مزامنة الوقت الذي تستأنف فيه التطبيقات عملها لبدء العرض، والوقت الذي يستأنف فيه SurfaceFlinger عمله لتركيب الشاشة، ودورة إعادة تحميل الشاشة. تؤدي هذه المزامنة إلى إزالة التشويش وتحسين الأداء المرئي للرسومات.

تنشئ HWC أحداث VSync وترسلها إلى SurfaceFlinger من خلال الدالة التنفيذية:

typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData,
        hwc2_display_t display, int64_t timestamp);

يتحكّم SurfaceFlinger في ما إذا كان HWC ينشئ أحداث VSync أم لا من خلال استدعاء setVsyncEnabled. تتيح خدمة 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 لتقليل وقت الاستجابة من الإدخال إلى العرض من خلال جعل إشارة التطبيق والتركيب مرتبطة بـ 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:

مسار DispSync

الشكل 1. مسار DispSync

تتضمّن DispSync الصفات التالية:

  • المرجع: HW_VSYNC_0
  • الناتج: VSYNC وSF_VSYNC
  • الملاحظات: إيقاف الطوابع الزمنية لإشارات السياج الجغرافي من HWC

إزاحات إيقاف VSync

يجب أن يتطابق الطابع الزمني لإشارة أسوار الإيقاف مع VSync للأجهزة، حتى على الأجهزة التي لا تستخدم مرحلة الإزاحة. وإلا، ستبدو الأخطاء أكثر خطورة مما هي عليه. تحتوي اللوحات الذكية غالبًا على فرق زمني يكون فيه حاجز الإيقاف هو نهاية الوصول المباشر إلى الذاكرة (DMA) لعرض الذاكرة، ولكن يحدث تبديل العرض الفعلي ومزامنة VSync للأجهزة بعد ذلك ببعض الوقت.

تم ضبط PRESENT_TIME_OFFSET_FROM_VSYNC_NS في ملف makefile الخاص بالجهاز BoardConfig.mk. ويستند ذلك إلى خصائص لوحة العرض ووحدة التحكّم. يتم قياس الوقت المستغرَق من الطابع الزمني لعلامة الإيقاف إلى إشارة HW VSync بالنانو ثانية.

إزاحات VSYNC وSF_VSYNC

يتم ضبط قيمتَي VSYNC_EVENT_PHASE_OFFSET_NS وSF_VSYNC_EVENT_PHASE_OFFSET_NS بشكل متحفّظ استنادًا إلى حالات الاستخدام التي تتطلّب تحميلًا عاليًا، مثل التركيب الجزئي لوحدة معالجة الرسومات أثناء انتقال النافذة أو تصفّح Chrome لصفحة ويب تحتوي على رسوم متحركة. تسمح هذه الإزاحات بزيادة وقت عرض التطبيق ووقت تركيب وحدة معالجة الرسومات.

ويكون التأخير ملحوظًا إذا تجاوز بضع ملّي ثوانٍ. للحدّ من وقت الاستجابة بدون زيادة عدد الأخطاء بشكل كبير، يمكنك دمج اختبار شامل للأخطاء آليًا.