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

تعد مكتبة 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 Throttling Intervention سرعة الألعاب بسرعة FPS مناسبة باستخدام تغييرات جانب النظام الأساسي فقط ودون الحاجة إلى أي إجراء من جانب المطورين.

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

GameManagerService

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

SurfaceFlinger

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

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

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

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

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

لفهم المزيد حول التحكم في سرعة الإطارات في الثانية ، راجع مقدمة التحكم في الإطارات في الثانية.