כשמפתחים או משפרים משחקים ל-Android, כדאי להבין באיזה צינור עיבוד נתונים גרפי המנוע משתמש. המנועים יכולים לבחור ב-Vulkan או ב-GLES בלי אותות ברורים שנגישים למפתחים. לצערנו, יש מצבים שבהם לא כדאי להסתמך על logcat כדי לבדוק אם המשחק פועל ב-Vulkan או חזר לפעול ב-OpenGL ES בלי להודיע על כך.
במדריך הזה מוסבר איך להשתמש ב-Android Performance Analyzer (APA) ובשאילתות SQL מותאמות אישית של Perfetto כדי לזהות באופן ודאי את ה-API הפעיל לעיבוד גרפי של המשחק.
המגבלות של אימות מבוסס-יומן
- יומנים מופשטים: גרסאות ייצור מסתירות לעיתים קרובות את עקבות האתחול וטעינת מנהלי ההתקנים.
- תוצאות חיוביות מוטעות: חלק ממנועי המשחקים טוענים את הספריות של Vulkan וגם של OpenGL ES במהלך ההפעלה, ומדפיסים את יומני האתחול של שניהם, גם אם אחד מהם נכשל בסופו של דבר ומפעיל חלופה.
- מעבר שקט למצב חלופי: אם ההפעלה של Vulkan נכשלת בגלל בעיות במנהל ההתקן הספציפי למכשיר, המנועים עוברים לעיתים קרובות ל-OpenGL ES בלי להציג שגיאות קריטיות.
מדידה באמצעות APA
בעזרת Android Performance Analyzer, אתם יכולים לתעד את עקבות המערכת ולנתח במדויק את נתוני הפריימים באמצעות שאילתות SQL. כדי למדוד את השימוש ב-Vulkan וב-GLES:
תיעוד עקבות המערכת באמצעות APA: מפעילים את המשחק ומשתמשים ב-APA כדי לתעד את עקבות המערכת במהלך הקטע שרוצים לנתח, למשל נקודה במהלך הגיימפליי שבה חושדים שיש נפילות פריימים. אחרי שהמכשיר מתחבר והקלטת המעקב מסתיימת, נתוני המעקב נטענים בממשק של APA.
לוחצים על הכרטיסייה SQL ב-APA: כשהמסך של ניתוח המעקב פתוח, בתפריט הניווט של ממשק המשתמש לוחצים על הכרטיסייה SQL כדי לפתוח את סביבת מעבד המעקב, שבה אפשר לשלוח שאילתות ישירות לנתונים.
מדביקים את שאילתת ה-SQL הבאה בכרטיסייה APA SQL: מעתיקים את שאילתת ה-SQL הבאה ומדביקים אותה בשדה להזנת קלט של השאילתה. השאילתה הזו סורקת את המעקב לאירועי API של שרטוט, כמו
eglSwapBuffers,QueuePresentKHRו-vkQueuePresentKHR. הוא מקבץ אותם לפי שם התהליך ומחשב את מספר הקריאות ל-API לעיבוד ואת אחוז ההתפלגות של הקריאות לעיבוד ב-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) ואחוז השימוש בכל API (egl_percentage(%)ו-vulkan_percentage(%)).
מסך שבו מוצגות שאילתת ה-SQL שהופעלה והתוצאה של מדדי ה-API לעיבוד שמוצגים בטבלה
בעיות נפוצות
הימנעו מבלבול שקשור ל-
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) כדי לתעד מעקב לצורך קבלת פטור מ-Google Play Games LevelUp, יש דרישות חומרה ספציפיות כדי שהמעקב יהיה תקין.
מומלץ מאוד לתעד את המעקב באמצעות אחד ממכשירי הבדיקה הווירטואליים של Level Up.
בנוסף, כדי להבטיח אימות מדויק, אסור לבצע את המעקב במכשיר שמשתמש ב-GPU של ANGLE. באופן ספציפי, אי אפשר להשתמש במכשירים הבאים כדי לתעד את המעקב של פטור LevelUp:
- כל מכשיר שבו ספק ה-GPU הוא SLSI (סמסונג), שמשתמש במעבדים גרפיים מסוג AMD Xclipse
- Pixel 11