تقوم إشارة VSYNC بمزامنة خط أنابيب العرض. يتكون مسار العرض من عرض التطبيق، وتكوين SurfaceFlinger، ومكونات الأجهزة (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 بنموذج لأحداث VSYNC الدورية المستندة إلى الأجهزة للعرض ويستخدم هذا النموذج لتنفيذ عمليات الاسترجاعات في إزاحات مرحلة معينة من أحداث VSYNC للأجهزة.
DispSync عبارة عن حلقة قفل طور برمجية (PLL) تقوم بإنشاء إشارات VSYNC وSF_VSYNC المستخدمة بواسطة Choreographer وSurfaceFlinger، حتى لو لم يتم إزاحتها من جهاز VSYNC.
![تدفق DispSync](https://source.android.com/static/docs/core/graphics/images/dispsync.png?authuser=6&hl=ar)
الشكل 1. تدفق DispSync
يتميز DispSync بالصفات التالية:
- المرجع — HW_VSYNC_0.
- الإخراج - VSYNC وSF_VSYNC.
- التعليقات - الطوابع الزمنية لإشارة السياج للتقاعد من مؤلف الأجهزة.
إزاحة 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
بشكل متحفظ بناءً على حالات الاستخدام ذات التحميل العالي، مثل التركيب الجزئي لوحدة معالجة الرسومات أثناء انتقال النافذة أو تمرير Chrome عبر صفحة ويب تحتوي على رسوم متحركة. تسمح هذه الإزاحات بوقت عرض طويل للتطبيق ووقت طويل لتكوين وحدة معالجة الرسومات.
يمكن ملاحظة زمن الوصول لأكثر من ميلي ثانية أو اثنين. لتقليل زمن الوصول إلى الحد الأدنى دون زيادة أعداد الأخطاء بشكل كبير، قم بدمج اختبار الأخطاء الآلي الشامل.