مكتبة تنظيم سرعة عرض اللقطات   جزء من مجموعة تطوير ألعاب Android.

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

خلفية

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

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

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

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

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

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

إرسال اللقطات بأسرع ما يمكن من خلال واجهة برمجة التطبيقات لعرض المحتوى

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

استخدام أداة Android Choreographer بمفردها

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

مزايا مكتبة "معدّل عرض اللقطات"

تستخدِم مكتبة Frame Pacing أداة Android Choreographer للمزامنة، وتعمل على معالجة التباين في عرض الإطارات. ويستخدم الطوابع الزمنية لعرض المحتوى للتأكّد من عرض اللقطات في الوقت المناسب وحدود المزامنة لتجنُّب حشوة المخزن المؤقت. تستخدم المكتبة NDK Choreographer إذا كان متاحًا، وتتحوّل إلى Java Choreographer إذا لم يكن متاحًا.

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

آلية العمل

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

تصحيح معدل عرض اللقطات بمعدّل 30 هرتز

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

معدل عرض اللقطات المثالي بمعدّل 30 هرتز على جهاز بمعدّل 60 هرتز

الشكل 1: معدّل عرض اللقطات المثالي بمعدّل 30 هرتز على جهاز بمعدّل 60 هرتز

اللقطات القصيرة في اللعبة تؤدي إلى حدوث تقطُّع

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

لقطات قصيرة من اللعبة

الشكل 2: يتسبب إطار C القصير في عرض إطار B لإطار واحد فقط، followed by multiple C frames.

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

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

الشكل 3: لقطة اللعبة "ب" معروضة مرتين لعرض أكثر سلاسة

تؤدي اللقطات الطويلة إلى حدوث تقطُّع وتأخير.

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

لقطات اللعب الطويلة

الشكل 4: يعرض اللقطة الطويلة "ب" وتيرة غير صحيحة لللقطتين "أ" و"ب".

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

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

الشكل 5: ينتظر الإطاران "ج" و"د" عرضهما.

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

يمكنك ضبط مكتبة "معدّل عرض اللقطات" للعمل في أحد الأوضاع الثلاثة التالية:

  • الوضع التلقائي غير مفعَّل + ميزة "المسار"
  • تفعيل الوضع التلقائي + ميزة "المسار الإجرائي"
  • تفعيل الوضع التلقائي + وضع مسار الإحالة الناجحة التلقائي (مسار الإحالة الناجحة/غير مسار الإحالة الناجحة)

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

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

وضع "المسار الإعلاني"

لتنسيق أعباء عمل المحرّك، تستخدم المكتبة عادةً نموذجًا للمسار المُعدّ للتنفيذ يفصل بين أعباء عمل وحدة المعالجة المركزية ووحدة معالجة الرسومات على مستوى حدود VSYNC.

وضع "المسار الإعلاني"

الشكل 6: وضع "المسار الإعلاني"

وضع "غير متوفّر في قناة التسويق"

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

وضع "غير متوفّر في قناة التسويق"

الشكل 7: وضع غير مُدار

وضع "تلقائي"

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

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

معدّلات تحديث متعددة

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

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

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

لمزيد من المعلومات حول معدل عرض اللقطات المتغير حسب معدّل التحديث، يُرجى الاطّلاع على مشاركة المدونة عرض المحتوى بمعدّل تحديث عالٍ على Android.

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

تقدّم مكتبة "تنظيم سرعة عرض اللقطات" الإحصاءات التالية لأغراض تصحيح الأخطاء وتحليل الأداء:

  • مخطّط بياني تكراري لعدد مرّات إعادة تحميل الشاشة التي انتظرها إطار في ملف الانتظار المركّب بعد اكتمال التقديم
  • مخطّط بياني هرمي لعدد مرّات إعادة تحميل الشاشة التي تمّت بين وقت عرض الإعلان المطلوب ووقت العرض الفعلي
  • مخطّط بياني بياني لعدد مرّات إعادة تحميل الشاشة التي تمّت بين إطارَين متتاليين
  • مخطّط بياني متدرّج لعدد مرّات تحديث الشاشة التي تمّت بين بدء عمل وحدة المعالجة المركزية لهذا الإطار والوقت الحالي الفعلي

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

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

مصادر إضافية