جلسة اللعب البطيئة هي الجلسة التي لا يبلغ فيها جزء كبير من اللقطات (على سبيل المثال، أكثر من% 25 من اللقطات) وقت عرض اللقطة المستهدَف، مثل 50 ملي ثانية لكل لقطة (ما يعادل 20 لقطة في الثانية) أو 34 ملي ثانية لكل لقطة (ما يعادل 30 لقطة في الثانية). يُعدّ تتبُّع أداء عدد اللقطات في الثانية وتحسينه أمرًا بالغ الأهمية لأنّ اللقطات التي يتم إسقاطها أو تأخيرها تؤثّر بشكل مباشر في سلاسة اللعبة واستجابتها للاعبين.
على Android، يتم قياس عدد اللقطات في الثانية للجلسة باستخدام بيانات من
SurfaceFlinger استنادًا إلى الفاصل الزمني بين اللقطات
المرسومة على مساحات العرض التي تملكها اللعبة (بما في ذلك مساحات عرض OpenGL وVulkan ومجموعة أدوات واجهة المستخدم من Android). إذا كان تطبيقك يستخدم أدوات واجهة المستخدم المستندة إلى View، حيث يتم رسم الجزء المرئي من التطبيق من Canvas أو التسلسل الهرمي View، يُرجى الرجوع إلى العرض البطيء.
كيفية قياس عدد اللقطات في الثانية ورصد اللقطات البطيئة
يوفّر الأمر dumpsys surfaceflinger timestats في Android متوسط عدد اللقطات في الثانية ومخططًا بيانيًا لتوقيت العرض إلى العرض لجميع الطبقات التي يتم عرضها. وقت العرض إلى العرض لإطار معيّن هو الفترة الفاصلة بين الإطار الحالي والإطار السابق الذي يتم رسمه. في ما يلي خطوات استخدام الأمر لجمع بيانات عدد اللقطات في الثانية في لعبتك:
نفِّذ الأمر مع العلامتَين
enableوclearلبدء تسجيل المعلومات:adb shell dumpsys SurfaceFlinger --timestats -clear -enableبعد تشغيل اللعبة لفترة كافية، نفِّذ الأمر مرة أخرى مع العلامة
dumpلعرض المعلومات:adb shell dumpsys SurfaceFlinger --timestats -dumpتوفّر المعلومات التي تم تفريغها إجمالي عدد اللقطات والمدرّج التكراري presentToPresent لجميع الطبقات التي يعرضها SurfaceFlinger. يجب العثور على قسم اللعبة من خلال الفلترة استنادًا إلى
layerName:layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833يمكن احتساب عدد اللقطات في الثانية البطيء للجلسة استنادًا إلى معلومات كل طبقة.
على سبيل المثال، النسبة المئوية للقطات البطيئة التي تبلغ 20 لقطة في الثانية = (مجموع القيم من 54 ملي ثانية إلى 1000 ملي ثانية) / إجمالي اللقطات × 100
totalFrames = 274 ... presentToPresent histogram is as below: 0ms=0 1ms=0 2ms=0 3ms=0 4ms=0 5ms=0 6ms=0 7ms=0 8ms=0 9ms=0 10ms=0 11ms=0 12ms=0 13ms=0 14ms=0 15ms=0 16ms=1 17ms=0 18ms=0 19ms=0 20ms=0 21ms=0 22ms=0 23ms=0 24ms=0 25ms=0 26ms=0 27ms=0 28ms=0 29ms=0 30ms=0 31ms=0 32ms=0 33ms=269 34ms=0 36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=1 54ms=0 58ms=0 62ms=0 66ms=0 70ms=1 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=0 106ms=0 110ms=0 114ms=0 118ms=0 122ms=0 126ms=0 130ms=0 134ms=0 138ms=0 142ms=0 146ms=0 150ms=0 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=0 600ms=0 650ms=0 700ms=0 750ms=0 800ms=0 850ms=0 900ms=0 950ms=0 1000ms=0يظهر أيضًا متوسط عدد اللقطات في الثانية لكل طبقة في ملف التفريغ:
... averageFPS = 30.179 ...بعد جمع كل المعلومات، عليك إيقاف timestats باستخدام العلامة
disable:adb shell dumpsys SurfaceFlinger --timestats -disable
أسباب بطء اللقطات وحلولها
هناك العديد من الأسباب التي قد تؤدي إلى عرض إطار أو تقديمه على الشاشة لمدة أطول من المدة التي يستهدفها المطوّر. قد تكون اللعبة مرتبطة بوحدة المعالجة المركزية (CPU) أو وحدة معالجة الرسومات (GPU). أو تتزايد درجة حرارة الجهاز ويتم تفعيل حالة حرارية محدودة. أو عدم تطابق بين معدّل عرض اللقطات في اللعبة ومعدّل إعادة تحميل الشاشة في الجهاز.
استخدِم أداة Android Frame Pacing (Swappy) وVulkan وADPF لمعالجة هذه المشاكل وتحسين أداء لعبتك.
ما هو Swappy؟
تُعد مكتبة Frame Pacing لنظام التشغيل Android، المعروفة أيضًا باسم Swappy، جزءًا من مكتبات AGDK. تساعد Swappy ألعاب OpenGL وVulkan في تحقيق عرض سلس وتحديد معدّل عرض اللقطات بشكل صحيح على Android.
مزامنة اللقطات هي مزامنة منطق اللعبة وحلقة العرض مع نظام فرعي للعرض في نظام التشغيل وأجهزة العرض الأساسية. تم تصميم نظام Android الفرعي للعرض لتجنُّب التشويش المرئي (المعروف باسم التقطيع) الذي يمكن أن يحدث عندما تنتقل أجهزة العرض إلى إطار جديد في منتصف عملية التحديث. لتجنُّب هذه المشاكل، يقوم نظام العرض الفرعي بما يلي:
- تخزين الإطارات السابقة مؤقتًا بشكل داخلي
- رصد عمليات إرسال الإطارات المتأخرة
- تكرار عرض اللقطات السابقة عند رصد لقطات متأخرة
كيفية استخدام لعبة Mir 2 لمكتبة Swappy من أجل تقليل معدّل الجلسات البطيئة من% 40 إلى%10
كيفية استخدام Swappy في المشاريع الأصلية
اطّلِع على الأدلة التالية لدمج مكتبة Android Frame Pacing في لعبتك:
كيفية استخدام Swappy في محرّك ألعاب Unity
دمجت Unity أداة Android Frame Pacing في محركها. لتفعيل هذه الميزة في Unity 2019.2 أو الإصدارات الأحدث، ضَع علامة في مربّع الاختيار "مزامنة اللقطات المحسّنة" ضمن إعدادات المشروع > المشغّل > الإعدادات في Android > الدقة والعرض:
بدلاً من ذلك، يمكنك تفعيل خيار "مزامنة اللقطات المحسّنة" برمجيًا في رمز المنطق للسماح لـ Unity بتوزيع اللقطات بالتساوي، ما يؤدي إلى تقليل التفاوت في عدد اللقطات في الثانية وإنشاء تجربة لعب أكثر سلاسة.
كيفية استخدام Swappy في محرك ألعاب Unreal
يتضمّن الإصدار 4.25 والإصدارات الأحدث من Unreal مكتبة Android Frame Pacing، وهي جزء من Android Game Development Kit. توضّح مقالة مزامنة عرض اللقطات على الأجهزة الجوّالة كيفية تفعيل مكتبة Frame Pacing لنظام التشغيل Android وكيفية التحكّم في مزامنة عرض اللقطات من رمز C++.
ما هي Vulkan؟
Vulkan هي واجهة برمجة تطبيقات حديثة ومتوافقة مع عدة أنظمة أساسية للرسومات الثلاثية الأبعاد، وهي مصمَّمة لتقليل التجريد بين أجهزة رسومات الأجهزة ولعبتك. Vulkan هي واجهة برمجة التطبيقات الأساسية للرسومات المنخفضة المستوى على Android، وهي تحلّ محل OpenGL ES. لا يزال OpenGL ES متاحًا على Android، ولكن لم يعُد قيد التطوير النشط للميزات.
تقدّم Vulkan المزايا التالية مقارنةً بإصدار OpenGL ES:
- بنية أكثر كفاءة مع تقليل النفقات العامة لوحدة المعالجة المركزية في برنامج تشغيل الرسومات
- استراتيجيات تحسين جديدة لتعزيز أداء وحدة المعالجة المركزية
- ميزات الرسومات الجديدة غير المتوفّرة في OpenGL ES، مثل واجهات برمجة التطبيقات غير المرتبطة وتتبُّع الأشعة
كيفية استخدام Vulkan في مشاريع Android الأصلية
يرشدك الدرس التطبيقي حول الترميز بدء استخدام Vulkan على Android إلى خطوات إعداد مسار عرض Vulkan، ثم عرض مثلث مزخرف يدور على الشاشة. استخدِم الدرس التطبيقي للتعرّف على كيفية عرض رسومات لعبتك.
كيفية استخدام Vulkan في محرّك ألعاب Unity
لتفعيل ميزة اختيار الجهاز تلقائيًا في Unity، اتّبِع الخطوات اللازمة لإعداد Auto Graphics API.
بدلاً من ذلك، يمكنك تفعيل Vulkan يدويًا من خلال إيقاف واجهة برمجة التطبيقات التلقائية للرسومات، وتحديد Vulkan كأولوية قصوى في قائمة واجهات برمجة التطبيقات للرسومات. إذا كنت تستخدم الإصدار 2021.1 من Unity أو إصدارًا أقدم، هذه هي الطريقة الوحيدة لاستخدام Vulkan.
استخدِم مكوّن VkQuality الإضافي لمحرك Unity لتقديم اقتراحات بشأن واجهة برمجة تطبيقات الرسومات التي يجب أن تستخدمها لعبتك على أجهزة معيّنة عند التشغيل.
كيفية استخدام Vulkan في محرّك ألعاب Unreal
لتفعيل واجهة برمجة تطبيقات الرسومات Vulkan، انتقِل إلى إعدادات المشروع > المنصات > Android > الإنشاء واختَر تفعيل Vulkan. عند اختيار كل من تفعيل Vulkan وتفعيل OpenGL ES3.2، تستخدم Unreal واجهة Vulkan تلقائيًا. إذا كان الجهاز لا يتوافق مع Vulkan، سيتم استخدام OpenGL ES 3.2 بدلاً منه.
إذا كنت تستخدم ميزات معيّنة من Vulkan معروف أنّها لا تعمل بشكل جيد على بعض الأجهزة، يمكنك تخصيص ملف BaseDeviceProfile.ini لاستبعاد هذه الأجهزة. اطّلِع على تخصيص ملفات تعريف الأجهزة وقابلية التوسّع لنظام التشغيل Android للتعرّف على كيفية تخصيص BaseDeviceProfile.ini. بما أنّ برامج تشغيل الأجهزة الجديدة قد تحلّ مشاكل الأجهزة المعروفة سابقًا، احرص على تحديث ملف BaseDeviceProfile.ini للحصول على جميع التحسينات.
ما هي واجهة برمجة التطبيقات ADPF؟
يعمل إطار عمل الأداء الديناميكي في Android (ADPF) على تحسين الألعاب استنادًا إلى ميزات الإدارة الديناميكية للحرارة ووحدة المعالجة المركزية ووحدة معالجة الرسومات على Android. مع أنّ التركيز ينصبّ على الألعاب، يمكنك أيضًا استخدام الميزات مع التطبيقات الأخرى التي تتطلّب أداءً عاليًا.
ADPF هي مجموعة من واجهات برمجة التطبيقات التي تتيح للألعاب والتطبيقات التي تتطلّب أداءً عاليًا التفاعل بشكل مباشر مع أنظمة الطاقة والأنظمة الحرارية في أجهزة Android. باستخدام واجهات برمجة التطبيقات هذه، يمكنك مراقبة السلوك الديناميكي على أنظمة Android وتحسين أداء الألعاب بمستوى مستدام لا يؤدي إلى ارتفاع درجة حرارة الأجهزة.
في ما يلي الميزات الرئيسية لواجهة برمجة التطبيقات ADPF:
- Thermal API: تتيح لك مراقبة الحالة الحرارية للجهاز حتى يتمكّن التطبيق من تعديل عبء العمل بشكل استباقي قبل أن يصبح غير مستدام.
- واجهة برمجة التطبيقات CPU Performance Hint API: توفّر تلميحات حول الأداء تتيح لنظام التشغيل Android اختيار إعدادات الأداء المناسبة (مثل نقطة تشغيل وحدة المعالجة المركزية أو النواة) لعبء العمل.
- واجهة برمجة التطبيقات Game Mode API وواجهة برمجة التطبيقات Game State API: تتيحان تحسين تجربة اللعب من خلال تحديد أولويات خصائص الأداء أو عمر البطارية، استنادًا إلى إعدادات المستخدم وإعدادات خاصة باللعبة.
- وضع الأداء الثابت: فعِّل وضع الأداء الثابت على الجهاز أثناء قياس الأداء للحصول على قياسات لا تتأثر بتحديد سرعة وحدة المعالجة المركزية الديناميكية.
- وضع توفير الطاقة: يوضّح للجلسة أنّه يمكن جدولة سلاسل المحادثات في "جلسة تلميحات الأداء" بأمان لتفضيل توفير الطاقة على الأداء. تتوفّر هذه الميزة في الإصدار 15 من نظام التشغيل Android (المستوى 35 لواجهة برمجة التطبيقات).
كيفية استخدام ADPF في مشاريع Android الأصلية
يرشدك برنامج دمج ميزات التكيّف في لعبتك الأصلية التعليمي إلى كيفية دمج ميزات ADPF في لعبتك من خلال خطوات يمكنك اتّباعها بالسرعة التي تناسبك. في نهاية هذا الدرس التطبيقي حول الترميز، ستكون قد دمجت الميزات التالية:
- واجهة Thermal API: يمكنك الاستماع إلى حالة الجهاز الحرارية والاستجابة قبل أن يدخل الجهاز في حالة الحدّ من سرعة المعالجة بسبب الحرارة.
- Game Mode API: يمكنك التعرّف على خيارات اللاعبين المفضّلة لتحسين الأداء (تحقيق أقصى أداء أو الحفاظ على البطارية) وتعديلها وفقًا لذلك.
- Game State API: تتيح للنظام معرفة حالة لعبتك (مثل التحميل أو التشغيل أو واجهة المستخدم وما إلى ذلك)، ويمكن للنظام تعديل الموارد وفقًا لذلك (زيادة سرعة الإدخال/الإخراج أو وحدة المعالجة المركزية أو وحدة معالجة الرسومات أو غير ذلك).
- Performance Hint API: يمكنك إعلام النظام بنموذج سلاسل المحادثات وعبء العمل لكي يتمكّن النظام من تخصيص الموارد وفقًا لذلك.
كيفية استخدام واجهة برمجة التطبيقات ADPF في محرك ألعاب Unity
Adaptive Performance من Unity هي أداة مخصّصة لمطوّري الألعاب الذين يتطلّعون إلى تحسين ألعابهم على الأجهزة الجوّالة، خاصةً في منظومة Android المتكاملة المتنوّعة. تتيح ميزة "الأداء التكيّفي" أن تتكيّف لعبتك مع أداء الجهاز وخصائصه الحرارية في الوقت الفعلي، ما يضمن تجربة لعب سلسة وفعّالة.
يقدّم لك موفر Adaptive Performance لنظام التشغيل Android إرشادات مفصّلة حول خطوات تنفيذ ADPF في Unity.
كيفية استخدام واجهة برمجة التطبيقات ADPF في محرّك ألعاب Unreal
- نزِّل المكوّن الإضافي.
- نسخ المكوّن الإضافي إلى مجلد المكوّنات الإضافية للمشروع
- تفعيل إضافة ADPF Unreal Engine في محرِّر Unreal
- إعادة تشغيل محرّر Unreal
- إنشاء اللعبة وتطويرها
توفّر إضافة إطار عمل الأداء الديناميكي في Android(ADPF) في Unreal Engine أداءً ثابتًا وتمنع الحدّ من سرعة المعالجة بسبب ارتفاع درجة الحرارة. نزِّل المكوّن الإضافي من GitHub. تغيّر هذه الإضافة الميزات من خلال ضبط قيم وحدة تحكّم Unreal.