مستوى سرعة الإطار

تعد مكتبة Android Frame Pacing، والمعروفة أيضًا باسم Swappy، جزءًا من Android Game SDK . فهو يساعد ألعاب 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، راجع

لقراءة المزيد، راجع تحقيق سرعة الإطار المناسبة .

إطارات في الثانية اختناق التدخل

يمكّن تدخل اختناق الإطارات في الثانية (FPS) الألعاب من التسارع بمعدل FPS مناسب باستخدام تغييرات جانب النظام الأساسي فقط ودون الحاجة إلى أي إجراء من جانب المطورين.

يستخدم تنفيذ تدخل اختناق FPS المكونات التالية:

GameManagerService

يحتفظ مكون GameManagerService بجميع المعلومات الخاصة بكل مستخدم وكل لعبة فيما يتعلق بوضع اللعبة والتدخل في اللعبة. يتم تخزين معلومات FPS في GameManagerService مع معلومات التدخل الأخرى، مثل عامل خفض حجم الدقة، في تعيين <PACKAGE_NAME, Interventions> لكل ملف تعريف مستخدم. يتم الوصول إلى معلومات FPS عند تغيير وضع اللعبة أو تحديث التدخل. يعد UID فريدًا لكل PACKAGE_NAME ومستخدم، ويمكن أيضًا ترجمته إلى زوج <UID, Frame Rate> لإرساله إلى SurfaceFlinger.

SurfaceFlinger

يدعم مكون SurfaceFlinger بالفعل التحكم في معدل الإطارات في الثانية (FPS) لأحد التطبيقات طالما أن معدل الإطارات يمثل مقسومًا على معدل تحديث الشاشة. في حالة vsync، يتحقق SurfaceFlinger من صحة vsync للتطبيق المقيد من خلال التحقق مما إذا كان الطابع الزمني vsync متوافقًا مع معدل إطارات التطبيق. إذا لم يكن معدل الإطارات في الطور مع vsync، فإن SurfaceFlinger يحتفظ بالإطار حتى يصبح معدل الإطارات وvsync في الطور.

يوضح الشكل التالي التفاعل بين GameManagerService وSurfaceFlinger:

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

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

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

لفهم المزيد حول اختناق FPS، راجع مقدمة اختناق FPS .