أثناء تطوير ألعاب Android أو تحسينها، قد يكون من المفيد في كثير من الأحيان معرفة مسار الرسومات الذي يستخدمه المحرّك، إذ قد تختار المحرّكات Vulkan أو GLES بدون إشارات واضحة يمكن للمطوّر الوصول إليها. في بعض الحالات، لا يمكن الاعتماد على logcat للتأكّد مما إذا كانت اللعبة تعمل على Vulkan أو تم الرجوع إلى OpenGL ES بدون إشعار.
يوضّح لك هذا الدليل كيفية استخدام أداة تحليل الأداء في Android (APA) واستخدام طلبات بحث SQL مخصّصة في Perfetto لتحديد واجهة برمجة التطبيقات النشطة للعرض في إحدى الألعاب بشكل قاطع.
القيود على التحقّق المستند إلى السجلّ
- السجلات المجردة: غالبًا ما تخفي إصدارات الإنتاج آثارًا متعلقة ببدء التشغيل وتحميل برامج التشغيل.
- النتائج الإيجابية الخاطئة: تحمّل بعض محرّكات الألعاب مكتبتَي Vulkan وOpenGL ES أثناء بدء التشغيل، وتعرض سجلّات التهيئة لكلتيهما، حتى إذا تعذّر تشغيل إحداهما في النهاية وتم تفعيل خيار احتياطي.
- الرجوع إلى الإصدارات السابقة بدون إشعار: إذا تعذّر بدء Vulkan بسبب مشاكل في برنامج التشغيل خاصة بالجهاز، غالبًا ما تعود المحرّكات إلى OpenGL ES بدون عرض أخطاء مهمة.
القياس باستخدام APA
باستخدام أداة Android Performance Analyzer، يمكنك تسجيل تتبُّع النظام وتحليل بيانات اللقطات بدقة من خلال طلبات بحث SQL. اتّبِع الخطوات التالية لقياس استخدامك لواجهات Vulkan وGLES:
تسجيل عملية التتبُّع باستخدام APA: شغِّل لعبتك واستخدِم APA لتسجيل عملية تتبُّع للنظام خلال المقطع الذي تريد تحليله، مثل نقطة أثناء اللعب تشك في حدوث انخفاض في عدد اللقطات فيها. بعد ربط الجهاز واكتمال تسجيل التتبُّع، يتم تحميل بيانات التتبُّع في واجهة APA.
انقر على علامة التبويب SQL في APA: عندما تكون شاشة تحليل التتبُّع مفتوحة، انقر على علامة التبويب SQL في قائمة التنقّل الخاصة بواجهة المستخدِم لفتح بيئة معالجة التتبُّع، حيث يمكنك طلب البحث عن البيانات مباشرةً.
ألصِق طلب SQL التالي في علامة التبويب APA SQL: انسخ طلب SQL التالي وألصِقه في حقل إدخال طلب البحث. يفحص هذا الطلب بيانات التتبُّع بحثًا عن أحداث واجهة برمجة التطبيقات الخاصة بالرسم، مثل
eglSwapBuffersوQueuePresentKHRوvkQueuePresentKHR. يتم تجميعها حسب اسم العملية، ويتم احتساب عدد طلبات البيانات من واجهة برمجة التطبيقات الخاصة بالعرض والتوزيع النسبي لطلبات العرض باستخدام Vulkan مقارنةً بـ OpenGL ES:WITH raw_slices AS ( -- 1. Map each slice (API call) to its corresponding process or package via UTID and UPID SELECT p.name AS process_name, s.name AS slice_name FROM slice s JOIN thread_track tt ON s.track_id = tt.id JOIN thread t USING (utid) JOIN process p USING (upid) WHERE (s.name LIKE 'eglSwapBuffers%' OR s.name IN ('QueuePresentKHR', 'vkQueuePresentKHR')) -- Optional: To isolate your game, uncomment the following and filter by package name and thread name: -- AND p.name = 'com.example.mygame' -- AND t.name = 'RenderThread' ), process_stats AS ( -- 2. Aggregate counts per individual process SELECT process_name, SUM(CASE WHEN slice_name LIKE 'eglSwapBuffers%' THEN 1 ELSE 0 END) AS egl_count, SUM(CASE WHEN slice_name IN ('QueuePresentKHR', 'vkQueuePresentKHR') THEN 1 ELSE 0 END) AS vulkan_count FROM raw_slices GROUP BY process_name ), process_totals AS ( -- 3. Calculate total counts for denominator calculation SELECT process_name, egl_count, vulkan_count, (egl_count + vulkan_count) AS total_count FROM process_stats ) -- 4. Calculate final percentage shares per row, preventing division by zero errors SELECT process_name, egl_count, vulkan_count, total_count, ROUND(CAST(egl_count AS REAL) * 100 / NULLIF(total_count, 0), 2) AS "egl_percentage(%)", ROUND(CAST(vulkan_count AS REAL) * 100 / NULLIF(total_count, 0), 2) AS "vulkan_percentage(%)" FROM process_totals ORDER BY total_count DESC;تنفيذ طلب البحث: انقر على الزر تنفيذ طلب البحث بالقرب من حقل الإدخال. بعد تنفيذ طلب البحث، يظهر جدول في جزء النتائج يعرض اسم العملية (
process_name) وعدد عروض OpenGL ES (egl_count) وعدد عروض Vulkan (vulkan_count) وإجمالي عدد العروض (total_count) ونسبة استخدام كل واجهة برمجة تطبيقات (egl_percentage(%)وvulkan_percentage(%)).
شاشة تعرض طلب بحث SQL الذي تم تنفيذه ومقاييس واجهة برمجة التطبيقات الناتجة التي يتم عرضها في جدول
المشاكل الشائعة
تجنُّب
SurfaceFlingerالالتباس: احرص دائمًا على حصر نطاق البحث في سلسلة تعليمات تطبيق لعبتك (RenderThread). قد تعرض عمليات التجميع على مستوى النظام، مثلSurfaceFlinger، مسارات Vulkan أو EGL التي تمثّل عرض واجهة المستخدم على مستوى النظام، وليس مسار العرض الداخلي للعبتك. لعزل لعبتك، أزِل التعليق من الفلاتر الاختيارية في عبارةWHEREضمن طلب بحث SQL الرئيسي واستبدِل'com.example.mygame'باسم حزمة لعبتك:-- AND p.name = 'com.example.mygame' -- AND t.name = 'RenderThread'فترة الإحماء: سجِّل دائمًا عملية التتبُّع بعد تحميل المشهد الثلاثي الأبعاد الرئيسي للعبة بالكامل. قد يؤدي تسجيل الشاشة أثناء ظهور شاشات البداية أو عمليات الانتقال إلى التحميل إلى عمليات إعداد مضلِّلة.
متطلبات تتبُّع الإعفاء من برنامج LevelUp
إذا كنت تستخدم أداة Android Performance Analyzer (APA) لتسجيل تتبُّع من أجل التأهّل للحصول على إعفاء من برنامج LevelUp في "ألعاب Google Play"، هناك متطلبات محدّدة للأجهزة يجب استيفاؤها ليكون التتبُّع صالحًا.
يُفضّل بشدة تسجيل عمليات التتبُّع باستخدام أحد أجهزة Level Up المرجعية المستهدَفة.
بالإضافة إلى ذلك، لضمان التحقّق من الصحة بدقة، يجب ألا يتم أخذ التتبُّع على جهاز يستخدم وحدة معالجة الرسومات ANGLE. على وجه التحديد، لا يمكنك استخدام الأجهزة التالية لتسجيل تتبُّع حالة الإعفاء من LevelUp:
- أي جهاز تكون فيه الشركة المصنّعة لوحدة معالجة الرسومات هي SLSI (Samsung)، ويستخدم وحدات معالجة الرسومات AMD Xclipse
- Pixel 11