مكتبة Frame Pacing لنظام التشغيل Android، المعروفة أيضًا باسم Swappy، هي جزء من حزمة تطوير البرامج (SDK) لألعاب Android. تساعد هذه الأداة ألعاب OpenGL وVulkan في تحقيق عرض سلس وتحديد معدّل عرض اللقطات بشكل صحيح على Android.
مزامنة اللقطات هي مزامنة حلقة عرض اللعبة ومنطقها مع نظام فرعي للعرض ونظام تشغيل وأجهزة العرض الأساسية. تم تصميم نظام Android الفرعي للعرض لتجنُّب بعض المشاكل المرئية، مثل التقطيع. يتجنّب نظام العرض الفرعي حدوث تشوّش في الصورة من خلال اتّباع ما يلي:
- تخزين الإطارات السابقة مؤقتًا بشكل داخلي
- رصد عمليات إرسال اللقطات المتأخرة
- مواصلة عرض الإطار الحالي عند رصد إطار متأخر
تحدث أوقات عرض اللقطات غير المتسقة بسبب تشغيل حلقة العرض في إحدى الألعاب بمعدّل مختلف عن المعدّل الذي يتيحه جهاز العرض الأصلي. تحدث المشاكل عندما تعمل حلقة العرض في إحدى الألعاب ببطء شديد بالنسبة إلى أجهزة العرض الأساسية، ما يؤدي إلى عدم اتساق أوقات العرض. على سبيل المثال، عندما تحاول لعبة تعمل بمعدل 30 لقطة في الثانية عرض لقطات على جهاز يتيح عرض 60 لقطة في الثانية، تتسبّب حلقة العرض في اللعبة في بقاء لقطة متكررة على الشاشة لمدة 16 مللي ثانية إضافية. يؤدي هذا النوع من عدم التوافق إلى حدوث تفاوتات كبيرة في أوقات اللقطات، مثل 33 مللي ثانية و16 مللي ثانية و49 مللي ثانية. وتزيد المشاهد المعقّدة للغاية من حدة هذه المشكلة لأنّها تتسبّب في عدم عرض بعض اللقطات.
تنفِّذ مكتبة Frame Pacing المهام التالية:
- تعويض التقطّع الناتج عن إطارات اللعبة القصيرة
- تضيف هذه السمة طوابع زمنية إلى العرض التقديمي لضمان عرض اللقطات في الوقت المناسب، وليس قبل الموعد المحدد.
- يستخدم امتدادات الطابع الزمني للعرض التقديمي
EGL_ANDROID_presentation_time
وVK_GOOGLE_display_timing
.
- يستخدم حواجز المزامنة للإطارات الطويلة التي تؤدي إلى التقطّع والبطء.
- يتم إدخال عمليات انتظار في التطبيق، ما يسمح لعملية عرض المحتوى باللحاق بالركب بدلاً من السماح بتراكم الضغط الخلفي.
- يستخدم حواجز المزامنة (
EGL_KHR_fence_sync
وVkFence
).
- يتم اختيار معدّل إعادة تحميل لتوفير المرونة وعرض سلس، إذا كان جهازك يتيح معدّلات إعادة تحميل متعددة.
- تقدّم هذه الخدمة إحصاءات لتصحيح الأخطاء وإنشاء الملفات الشخصية باستخدام إحصاءات الإطارات.
للتعرّف على كيفية ضبط المكتبة للعمل في أوضاع مختلفة حسب احتياجاتك، اطّلِع على أوضاع التشغيل المتوافقة.
لتنفيذ ذلك باستخدام عارض OpenGL أو عارض Vulkan، يُرجى الاطّلاع على ما يلي:
- دمج ميزة "مزامنة عرض اللقطات" في Android في أداة العرض OpenGL
- دمج Android Frame Pacing في أداة العرض Vulkan
لمزيد من المعلومات، اطّلِع على مكتبة Frame Pacing.
إجراءات الحدّ من عدد اللقطات في الثانية
يتيح التدخّل في الحدّ من عدد اللقطات في الثانية (FPS) للألعاب تحديد عدد اللقطات المناسب في الثانية باستخدام تغييرات من جهة المنصة فقط وبدون الحاجة إلى اتّخاذ أي إجراء من جانب المطوّرين.
يستخدم تنفيذ إجراء الحدّ من عدد اللقطات في الثانية المكوّنات التالية.
GameManagerService
يحتفظ مكوّن
GameManagerService بجميع المعلومات الخاصة بكل مستخدم وبكل لعبة حول وضع اللعبة والتدخّل في اللعبة. يتم تخزين معلومات عدد اللقطات في الثانية في
GameManagerService مع معلومات التدخّل الأخرى، مثل عامل تقليل دقة العرض،
في عملية ربط <PACKAGE_NAME, Interventions>
لكل ملف شخصي للمستخدم.
يتم الوصول إلى معلومات عدد اللقطات في الثانية عند تغيير وضع اللعبة أو تعديل التدخّل. UID
هو معرّف فريد لكل PACKAGE_NAME
ومستخدم، ويمكن ترجمته أيضًا إلى زوج <UID, Frame Rate>
لإرساله إلى SurfaceFlinger.
SurfaceFlinger
يتيح مكوّن SurfaceFlinger حاليًا خفض عدد اللقطات في الثانية للتطبيق طالما أنّ عدد اللقطات في الثانية هو أحد قواسم معدّل إعادة تحميل شاشة العرض. في حال حدوث VSync، يتحقّق SurfaceFlinger من صلاحية VSync للتطبيق الذي تم تقييد سرعته من خلال التأكّد مما إذا كان الطابع الزمني لـ VSync متزامنًا مع معدّل عرض اللقطات في التطبيق. إذا لم يكن عدد اللقطات في الثانية متزامنًا مع VSync، سيحتفظ SurfaceFlinger باللقطة إلى أن يتزامن عدد اللقطات في الثانية مع VSync.
يوضّح الشكل التالي التفاعل بين GameManagerService وSurfaceFlinger:

الشكل 1. التفاعل بين GameServiceManager وSurfaceFlinger
تحتفظ SurfaceFinger بعملية ربط <UID, Frame Rate>
لتحديد أولوية جديدة لتحديد عدد اللقطات في الثانية. ويكون UID
فريدًا بين المستخدمين والألعاب، ما يتيح لكل مستخدم على جهاز واحد ضبط معدّل عرض إطارات مختلف للعبة نفسها. لتقليل معدّل عرض اللقطات في الثانية لإحدى الألعاب، يستدعي GameServiceManager خدمة SurfaceFlinger لتجاوز معدّل عرض اللقطات في الثانية لمعرّف UID. باستخدام هذه الآلية، يحدِّث SurfaceFlinger عملية الربط كلما تم تغيير وضع اللعبة أو تعديل التدخّل. يتعامل SurfaceFlinger مع تغيير عدد اللقطات في الثانية من خلال إغلاق المخازن المؤقتة وفقًا لذلك.
لمزيد من المعلومات حول تقييد عدد اللقطات في الثانية، يُرجى الاطّلاع على مقالة تقييد عدد اللقطات في الثانية.