مكتبة وتيرة الإطارات جزء من حزمة تطوير ألعاب Android.

مكتبة نظام ترتيب الإطارات في Android، المعروفة أيضًا باسم Suppy، هي جزء من مكتبات AGDK. وهو يساعد ألعاب OpenGL وVulkan في تحقيق عرض سلس مستوى سرعة عرض الإطارات الصحيح على Android يحدد هذا المستند سرعة الإطارات، ويصف الحالات التي تكون فيها سرعة عرض الإطارات مطلوبة، وتوضح كيفية معالجة المكتبة لهذه المواقف. إذا كنت تريد الانتقال مباشرةً إلى تنفيذ سرعة الإطار في اللعبة، يُرجى الاطّلاع على الخطوة التالية.

خلفية

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

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

تخبرك اللعبة SurfaceFlinger، التابع للنظام الفرعي في العرض، أرسل جميع عمليات الرسم يلزم إجراء المكالمات لإطار (من خلال الاتصال بـ eglSwapBuffers أو vkQueuePresentKHR). يشير SurfaceFlinger إلى توفُّر إطار لجهاز العرض باستخدام مزلاج. بعد ذلك، تعرض جهاز العرض الإطار المحدّد. مكونات الشاشة علامات بمعدّل ثابت، على سبيل المثال 60 هرتز، وإذا لم يكن هناك إطار جديد عند يحتاج الجهاز إلى إطار واحد، ويعرض الجهاز الإطار السابق مرة أخرى.

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

حلول غير مثالية

سبق أن استخدمت الألعاب الحلول التالية لتحديد سرعة عرض اللقطة ويؤدي ذلك عادةً إلى عدم تناسق أوقات عرض اللقطات وزيادة وقت استجابة الإدخال.

إرسال الإطارات بالسرعة التي تسمح بها واجهة برمجة التطبيقات للعرض

يربط هذا الأسلوب اللعبة بنشاط SurfaceFlinger المتغير ويقدم الإطار الإضافي لوقت الاستجابة. يحتوي مسار العرض على قائمة انتظار من الإطارات، بحجم 2 عادةً، وامتلأت إذا حاولت اللعبة عرض إطارات أيضًا بسرعة. ومع عدم وجود مساحة إضافية في قائمة الانتظار، قد تتضمن حلقة الألعاب (أو على الأقل عرض سلسلة التعليمات) تم حظرها من خلال استدعاء OpenGL أو Vulkan. تبدأ اللعبة مجبرًا على الانتظار حتى تعرض معدات الشاشة إطارًا، وهذا الضغط الخلفي يقوم بمزامنة المكونين. ويُعرف هذا الوضع باسم حشو المخزن المؤقت أو حشو قائمة الانتظار. عملية العارض لا يدرك ما يجري، لذلك يزداد التناقض في عدد اللقطات سوءًا. إذا كانت يتم إدخال عيّنات من اللعبة قبل عرض اللقطة، فيزداد وقت استجابة الإدخال سوءًا.

استخدام "مصمم الرقصات" من Android وحده

تستخدم الألعاب أيضًا تطبيق Android Choreographer للمزامنة. هذا المكون، متوفرة في Java من واجهة برمجة التطبيقات 16 وفي C++ من واجهة برمجة التطبيقات 24، وتوفر مؤشرات منتظمة في بالتردد نفسه للنظام الفرعي للعرض. لا تزال هناك خفية بشأن عندما يتم تسليم هذه العلامة بالنسبة إلى VSYNC الفعلي للأجهزة، تختلف الاعتمادات حسب الجهاز. وقد يحدث ازدحام مؤقت أيضًا في الإطارات الطويلة.

مزايا مكتبة وتيرة الإطار

تستخدم مكتبة تنظيم سرعة الإطار مصمم رقصات Android للمزامنة يتعامل مع التباين في تسليم التجزئة بالنسبة لك. فهو يستخدم العرض التقديمي طوابع زمنية لضمان عرض اللقطات في الوقت المناسب ومزامنة الحدود لتجنب ازدحام المورد الاحتياطي. تستخدم المكتبة مصمّم رقصات NDK إذا كان متوفرًا إلى مصمم رقصات Java في حال إلا أنه ليس كذلك.

تتعامل المكتبة مع معدّلات تحديث متعدّدة إذا كانت متوافقة مع الجهاز ما يمنح اللعبة المزيد من المرونة في عرض الإطار. على سبيل المثال، بالنسبة إلى جهاز يدعم معدل التحديث 60 هرتز بالإضافة إلى 90 هرتز، وهي لعبة لا يمكنها إنتاج 60 لقطة في الثانية يمكن أن ينخفض إلى 45 لقطة في الثانية بدلاً من 30 لقطة في الثانية للبقاء بسلاسة. ترصد المكتبة العدد المتوقّع للقطات في الثانية في اللعبة وتضبط اللقطات تلقائيًا. أوقات العرض وفقًا لذلك. تعمل مكتبة Frame Pacing أيضًا على تحسين شحن البطارية لأنه يتجنب تحديثات العرض غير الضرورية. على سبيل المثال، إذا كانت لعبة ما العرض بمعدل 60 لقطة في الثانية ولكن يتم تحديث الشاشة بمعدّل 120 هرتز، ويتم تحديثها مرتين لكل إطار. تتجنب مكتبة وتيرة الإطارات هذا من خلال تعيين معدّل إعادة التحميل إلى القيمة المتوافقة مع الجهاز الأقرب إلى الهدف عدد اللقطات في الثانية

آلية العمل

توضح الأقسام التالية كيفية تعامل مكتبة سرعة الإطار مع عمليات الإطارات القصيرة من أجل تحقيق السرعة الصحيحة للّقطات.

وتيرة صحيحة للإطار عند 30 هرتز

عند العرض بمعدل 30 هرتز على جهاز 60 هرتز، فإن الوضع المثالي على نظام Android هو كما هو موضح في الشكل 1. SurfaceFlinger تضم مخازن مؤقتة جديدة للرسومات، إن وجدت (NB في يشير الرسم التخطيطي إلى "لا يوجد مورد احتياطي" الحالي وتكرار السابق).

وتيرة مثالية للإطار عند 30 هرتز على جهاز بتردد 60 هرتز

الشكل 1. وتيرة مثالية للإطار عند 30 هرتز على جهاز بتردد 60 هرتز

إطارات الألعاب القصيرة تؤدي إلى التقطُّع

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

إطارات ألعاب قصيرة

الشكل 2. وقد تسبب إطار اللعبة القصيرة "ج" في عرض الإطار "ب" فقط إطارًا واحدًا، متبوعة بعدة إطارات C

وتحل مكتبة تنظيم سرعة الإطارات هذه المشكلة باستخدام الطوابع الزمنية للعرض التقديمي. تشير رسالة الأشكال البيانية مكتبة تستخدم إضافات الطابع الزمني للعروض التقديمية EGL_ANDROID_presentation_time أو VK_GOOGLE_display_timing بحيث لا يتم عرض الإطارات مبكرًا، كما هو موضح في الشكل 3.

الطوابع الزمنية للعروض التقديمية

الشكل 3. تم تقديم إطار اللعبة B مرّتين للحصول على عرض أكثر سلاسة.

اللقطات الطويلة تؤدي إلى التقطُّع ووقت الاستجابة

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

إطارات الألعاب الطويلة

الشكل 4. عرض الإطار الطويل B بوتيرة غير صحيحة لإطارَين: A وB

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

الانتظارات المُضافة إلى طبقة التطبيق

الشكل 5. ينتظر الإطاران C وD العرض

أوضاع التشغيل المتوافقة

يمكنك تهيئة مكتبة سرعة الإطار للعمل في واحدة من الثلاثة الأوضاع التالية:

  • إيقاف الوضع التلقائي + مسار التنفيذ
  • الوضع التلقائي: مفعَّل + خط الأنابيب
  • الوضع التلقائي مفعّل + الوضع التلقائي لمسار التعلّم (المسارات المحورية)

يمكنك تجربة أوضاع الوضع التلقائي والمسار، ولكن يمكنك البدء بتحويل وإيقاف تضمين ما يلي بعد إعداد Stappy:

  swappyAutoSwapInterval(false);
  swappyAutoPipelineMode(false);
  swappyEnableStats(false);
  swappySwapIntervalNS(1000000000L/yourPreferredFrameRateInHz);

وضع الأنابيب

لتنسيق أعباء عمل المحرِّك، تستخدم المكتبة عادةً نموذج مسار التعلّم يفصل بين مهام العمل لوحدة المعالجة المركزية (CPU) ووحدة معالجة الرسومات (GPU) ضمن حدود VSYNC.

وضع الأنابيب

الشكل 6. وضع الأنابيب

وضع عدم المسار

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

وضع عدم المسار

الشكل 7. وضع عدم المسار

وضع "تلقائي"

لا تعرف معظم الألعاب كيفية اختيار فاصل التبديل، وهو المدة الذي يتم عرض كل إطار فيه (على سبيل المثال، 33.3 ملي ثانية لمدة 30 هرتز). في بعض الأجهزة، يمكن عرض لعبة ما بمعدّل 60 لقطة في الثانية، بينما قد تحتاج إلى تخفيض عدد اللقطات في الثانية إلى أقل يقيس الوضع التلقائي عدد مرات استخدام وحدة المعالجة المركزية (CPU) ووحدة معالجة الرسومات (GPU) من أجل إجراء ما يلي:

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

معدلات إعادة التحميل المتعددة

الأجهزة التي تدعم معدلات تحديث متعددة توفر مرونة أكبر في اختيار فاصل تبديل يبدو سلسًا:

  • على الأجهزة التي تعمل بتردد 60 هرتز: 60 لقطة في الثانية / 30 لقطة في الثانية / 20 لقطة في الثانية
  • على الأجهزة التي تستخدم التردد 60 هرتز + 90 هرتز: 90 لقطة في الثانية / 60 لقطة في الثانية / 45 لقطة في الثانية / 30 لقطة في الثانية
  • على الأجهزة التي تستخدم التردد 60 هرتز + 90 هرتز + 120 هرتز: 120 لقطة في الثانية / 90 لقطة في الثانية / 60 لقطة في الثانية / 45 لقطة في الثانية / 40 لقطة في الثانية / 30 لقطة في الثانية

تختار المكتبة معدّل التحديث الذي يتطابق على أفضل نحو مع العرض الفعلي. مدة عرض إطارات اللعبة، ما يوفر تجربة مرئية أفضل.

لمزيد من المعلومات حول إيقاع عدد اللقطات في الثانية لمعدل التحديث المتعدد، يمكنك الاطّلاع على عرض معدّل إعادة التحميل المرتفع على نظام التشغيل Android مشاركة المدونة.

إحصاءات الإطار

تقدم مكتبة سرعة الإطار الإحصائيات التالية لتصحيح الأخطاء أغراض إنشاء الملفات التعريفية:

  • مدرّج تكراري لعدد مرات تحديث الشاشة التي ينتظرها الإطار قائمة انتظار أداة الإنشاء بعد اكتمال العرض.
  • مدرّج تكراري لعدد عمليات إعادة تحميل الشاشة التي تم تمريرها بين العمليات المطلوبة وقت العرض والوقت الفعلي الحالي.
  • مدرّج تكراري لعدد عمليات إعادة تحميل الشاشة التي تم تمريرها بين عمليتين متتاليتين الإطارات.
  • مدرّج تكراري لعدد عمليات إعادة تحميل الشاشة التي تم تمريرها بين بداية تعمل وحدة المعالجة المركزية (CPU) على هذا الإطار والوقت الحالي الفعلي.

الخطوة التالية

يمكنك الاطّلاع على أي من الأدلة التالية لدمج مكتبة Android Frame Pacing إلى لعبتك: