وتيرة عرض اللقطات

مكتبة Android Frame Pacing، المعروفة أيضًا باسم Swappy، هي جزء من الـ Android Game SDK. تساعد هذه المكتبة ألعاب OpenGL و Vulkan في تحقيق عرض سلس وتحديد عدد اللقطات في الثانية بشكل صحيح على Android.

تحديد عدد اللقطات في الثانية هو مزامنة منطق اللعبة وحلقة العرض مع نظام العرض الفرعي لنظام التشغيل وأجهزة العرض الأساسية. تم تصميم نظام العرض الفرعي في Android لتجنُّب بعض المشاكل المرئية، مثل التقطّع. يتجنّب نظام العرض الفرعي التقطّع من خلال ما يلي:

  • تخزين اللقطات السابقة مؤقتًا داخليًا
  • رصد عمليات إرسال اللقطات المتأخرة
  • مواصلة عرض اللقطة الحالية عند رصد لقطة متأخرة

تنتج أوقات عرض اللقطات غير المتسقة عن تشغيل حلقة العرض في اللعبة بمعدّل مختلف عن المعدّل الذي يتيحه جهاز العرض الأصلي. تحدث المشاكل عندما يتم تشغيل حلقة العرض في اللعبة ببطء شديد بالنسبة إلى جهاز العرض الأساسي، ما يؤدي إلى أوقات عرض غير متسقة. على سبيل المثال، عندما تحاول لعبة تعمل بمعدّل 30 لقطة في الثانية العرض على جهاز يتيح بشكل أساسي 60 لقطة في الثانية، تؤدي حلقة العرض في اللعبة إلى بقاء لقطة متكرّرة على الشاشة لمدة 16 ملي ثانية إضافية. يؤدي هذا النوع من الانقطاع إلى حدوث اختلافات كبيرة في أوقات اللقطات، مثل 33 ملي ثانية و16 ملي ثانية و49 ملي ثانية. تزيد المشاهد المعقّدة بشكل مفرط من هذه المشكلة لأنّها تؤدي إلى حدوث لقطات فائتة.

تنفّذ مكتبة Frame Pacing المهام التالية:

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

للتعرّف على كيفية ضبط المكتبة للتشغيل في أوضاع مختلفة وفقًا لاحتياجاتك، اطّلِع على أوضاع التشغيل المتوافقة.

لتنفيذ العرض باستخدام عارض OpenGL أو عارض 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:

التفاعل بين GameManagerService وSurfaceFlinger

الشكل 1: التفاعل بين GameServiceManager وSurfaceFlinger

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

لمزيد من المعلومات عن الحدّ من عدد اللقطات في الثانية، اطّلِع على الحدّ من عدد اللقطات في الثانية.