Lorsque vous développez ou optimisez des jeux Android, il peut souvent être utile de comprendre quel pipeline graphique votre moteur utilise. Les moteurs peuvent choisir Vulkan ou GLES sans signaux clairement accessibles aux développeurs. Malheureusement, il existe des situations où il n'est pas fiable de s'appuyer sur logcat pour vérifier si un jeu s'exécute sur Vulkan ou s'il est passé silencieusement à OpenGL ES.
Ce guide explique comment utiliser l'analyseur de performances Android (APA) et les requêtes SQL Perfetto personnalisées pour identifier de manière définitive l'API de rendu active d'un jeu.
Limites de la validation basée sur les journaux
- Journaux dépouillés : les builds de production masquent souvent les empreintes d'initialisation et de chargement du pilote.
- Faux positifs : certains moteurs de jeu chargent les bibliothèques Vulkan et OpenGL ES au démarrage, et affichent des journaux d'initialisation pour les deux, même si l'un d'eux finit par échouer et déclencher un retour à une version antérieure.
- Remplacements silencieux : si l'initialisation de Vulkan échoue en raison de problèmes de pilote spécifiques à l'appareil, les moteurs reviennent souvent à OpenGL ES sans générer d'erreurs critiques.
Mesurer avec l'APA
À l'aide d'Android Performance Analyzer, vous pouvez enregistrer une trace système et analyser précisément les données de frame à l'aide de requêtes SQL. Pour mesurer votre utilisation de Vulkan et GLES, procédez comme suit :
Capturez la trace avec APA : exécutez votre jeu et utilisez APA pour capturer une trace système pendant le segment que vous souhaitez analyser, par exemple un point du gameplay où vous soupçonnez des chutes de frames. Une fois l'appareil connecté et l'enregistrement de trace terminé, les données de trace se chargent dans l'interface APA.
Cliquez sur l'onglet "SQL" dans APA : lorsque l'écran d'analyse des traces est ouvert, dans le menu de navigation de l'UI, cliquez sur l'onglet SQL pour ouvrir l'environnement du processeur de trace, où vous pouvez interroger directement les données.
Collez la requête SQL suivante dans l'onglet "SQL APA" : copiez la requête SQL suivante et collez-la dans le champ de saisie de la requête. Cette requête analyse la trace pour rechercher les événements de l'API Drawing, tels que
eglSwapBuffers,QueuePresentKHRetvkQueuePresentKHR. Il les regroupe par nom de processus et calcule le nombre d'API de rendu et la répartition en pourcentage des appels de rendu Vulkan par rapport à 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;Exécutez la requête : cliquez sur le bouton Exécuter la requête à côté du champ de saisie. Une fois la requête exécutée, un tableau s'affiche dans le volet des résultats. Il indique le nom du processus (
process_name), le nombre de présentations OpenGL ES (egl_count), le nombre de présentations Vulkan (vulkan_count), le nombre total de présentations (total_count) et le pourcentage de chaque API utilisée (egl_percentage(%)etvulkan_percentage(%)).
Capture d'écran montrant la requête SQL exécutée et les métriques de l'API de rendu résultantes affichées dans un tableau
Écueils les plus courants
Évitez toute confusion avec
SurfaceFlinger: limitez toujours votre recherche au thread d'application de votre jeu (RenderThread). Les processus de compositeur à l'échelle du système, commeSurfaceFlinger, peuvent afficher des pistes Vulkan ou EGL qui représentent le rendu de l'UI du système, et non le pipeline de rendu interne de votre jeu. Pour isoler votre jeu, annulez la mise en commentaire des filtres facultatifs dans la clauseWHEREde la requête SQL principale et remplacez'com.example.mygame'par le nom de package de votre jeu :-- AND p.name = 'com.example.mygame' -- AND t.name = 'RenderThread'Période d'échauffement : enregistrez toujours la trace après le chargement complet de la scène 3D principale du jeu. La capture d'écran pendant les écrans de démarrage ou les transitions de chargement peut entraîner des initialisations trompeuses.
Exigences concernant la trace d'exemption LevelUp
Si vous utilisez l'outil Android Performance Analyzer (APA) pour capturer une trace et bénéficier d'une exemption Google Play Jeux LevelUp, la trace doit répondre à des exigences matérielles spécifiques pour être valide.
Nous vous recommandons vivement de capturer votre trace à l'aide de l'un des appareils de référence Level Up ciblés.
De plus, pour garantir une validation précise, votre trace ne doit pas être effectuée sur un appareil utilisant un GPU ANGLE. Plus précisément, vous ne pouvez pas utiliser les appareils suivants pour capturer la trace de votre exemption LevelUp :
- Tout appareil dont le fournisseur de GPU est SLSI (Samsung) et qui utilise des GPU AMD Xclipse
- Pixel 11