Identifier l'API de rendu de jeu Vulkan par rapport à OpenGL ES

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ù l'utilisation de logcat pour vérifier si un jeu s'exécute sur Vulkan ou s'il est revenu silencieusement à OpenGL ES peut ne pas être fiable.

Ce guide explique comment utiliser Android Performance Analyzer (APA) et des 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 supprimés : les builds de production masquent souvent les empreintes d'initialisation et de chargement des pilotes.
  • Faux positifs : certains moteurs de jeu chargent les bibliothèques Vulkan et OpenGL ES au démarrage, et affichent les journaux d'initialisation des deux, même si l'un d'eux finit par échouer et déclenche un remplacement.
  • Créations de remplacement silencieuses : 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 à l'aide de l'APA

Avec 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 :

  1. Capturer 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 moment du gameplay où vous suspectez des pertes d'images. Une fois l'appareil connecté et l'enregistrement de la trace terminé, les données de trace se chargent dans l'interface d'APA.

  2. Cliquez sur l'onglet SQL dans APA : lorsque l'écran d'analyse des traces est ouvert, dans le menu de navigation de l'interface utilisateur, cliquez sur l'onglet SQL pour ouvrir l'environnement du processeur de traces, où vous pouvez interroger directement les données.

  3. Collez la requête SQL suivante dans l'onglet "APA SQL" : copiez la requête SQL suivante et collez-la dans le champ de saisie de la requête. Cette requête analyse la trace à la recherche d'événements d'API de dessin, tels que eglSwapBuffers, QueuePresentKHR et vkQueuePresentKHR. 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;
    
  4. 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(%) et vulkan_percentage(%)).

    Écran affichant la requête SQL exécutée et les métriques de l'API de rendu qui en résultent, présenté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 composition à l'échelle du système, tels que SurfaceFlinger, peuvent afficher des pistes Vulkan ou EGL qui représentent le rendu de l'interface utilisateur 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 clause WHERE de 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 de préchauffage : enregistrez toujours la trace après le chargement complet de la scène 3D principale du jeu. La capture pendant les écrans de démarrage ou les transitions de chargement peut entraîner des initialisations trompeuses.

Exigences de traçabilité des exemptions LevelUp

Si vous utilisez Android Performance Analyzer (APA) pour capturer une trace afin de bénéficier d'une exemption LevelUp Google Play Jeux, des exigences matérielles spécifiques doivent être respectées pour que la trace soit 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 votre trace d'exemption LevelUp :

  • Tout appareil dont le fournisseur de GPU est SLSI (Samsung), qui utilise des GPU AMD Xclipse
  • Le Pixel 11