Vulkan- oder OpenGL ES-API für das Rendern von Spielen ermitteln

Bei der Entwicklung oder Optimierung von Android-Spielen kann es oft hilfreich sein, zu wissen, welche Grafikpipeline Ihre Engine verwendet. Engines können Vulkan oder GLES ohne eindeutige, für Entwickler zugängliche Signale auswählen. Leider gibt es Situationen, in denen es unzuverlässig sein kann, sich auf logcat zu verlassen, um zu prüfen, ob ein Spiel auf Vulkan ausgeführt wird oder ob es still auf OpenGL ES zurückgefallen ist.

In diesem Leitfaden erfahren Sie, wie Sie mit dem Android Performance Analyzer (APA) und benutzerdefinierten Perfetto-SQL-Abfragen die aktive Rendering-API eines Spiels ermitteln können.

Einschränkungen der logbasierten Überprüfung

  • Bereinigte Logs: In Produktions-Builds werden häufig Initialisierungs- und Treiberlade-Footprints ausgeblendet.
  • Falsch positive Ergebnisse: Einige Spiel-Engines laden beim Start sowohl Vulkan- als auch OpenGL ES-Bibliotheken und geben Initialisierungslogs für beide aus, auch wenn eine schließlich fehlschlägt und einen Fallback auslöst.
  • Stille Fallbacks: Wenn die Vulkan-Initialisierung aufgrund gerätespezifischer Treiberprobleme fehlschlägt, greifen Engines häufig auf OpenGL ES zurück, ohne kritische Fehler auszugeben.

Messung mit APA

Mit dem Android Performance Analyzer können Sie einen System-Trace aufzeichnen und Framedaten mithilfe von SQL-Abfragen genau analysieren. So messen Sie die Nutzung von Vulkan und GLES:

  1. Trace mit APA aufzeichnen: Führen Sie Ihr Spiel aus und verwenden Sie APA, um während des zu analysierenden Segments einen System-Trace aufzuzeichnen, z. B. an einer Stelle im Spiel, an der Sie Frame-Drops vermuten. Nachdem das Gerät verbunden und die Aufzeichnung abgeschlossen ist, werden die Trace-Daten in die APA-Oberfläche geladen.

  2. Klicken Sie in APA auf den Tab „SQL“: Wenn der Bildschirm für die Trace-Analyse geöffnet ist, klicken Sie im Navigationsmenü der Benutzeroberfläche auf den Tab SQL, um die Trace-Prozessor-Umgebung zu öffnen, in der Sie die Daten direkt abfragen können.

  3. Fügen Sie die folgende SQL-Abfrage auf dem Tab „APA SQL“ ein: Kopieren Sie die folgende SQL-Abfrage und fügen Sie sie in das Abfrageeingabefeld ein. Mit dieser Abfrage werden im Trace Zeichen-API-Ereignisse wie eglSwapBuffers, QueuePresentKHR und vkQueuePresentKHR gescannt. Die Daten werden nach Prozessname gruppiert und die Anzahl der Rendering-APIs sowie die prozentuale Verteilung der Vulkan- und OpenGL ES-Rendering-Aufrufe werden berechnet:

    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. Abfrage ausführen: Klicken Sie in der Nähe des Eingabefelds auf den Button Abfrage ausführen. Nachdem die Abfrage ausgeführt wurde, wird im Ergebnisbereich eine Tabelle mit dem Prozessnamen (process_name), der Anzahl der OpenGL ES-Präsentationen (egl_count), der Anzahl der Vulkan-Präsentationen (vulkan_count), der Gesamtzahl der Präsentationen (total_count) und dem Prozentsatz der einzelnen verwendeten APIs (egl_percentage(%) und vulkan_percentage(%)) angezeigt.

    Bildschirm mit der ausgeführten SQL-Abfrage und den resultierenden Rendering API-Messwerten in einer Tabelle

Häufige Schwierigkeiten

  • SurfaceFlinger-Verwirrung vermeiden: Beschränken Sie Ihre Suche immer auf den Anwendungs-Thread Ihres Spiels (RenderThread). Systemweite Compositor-Prozesse wie SurfaceFlinger können Vulkan- oder EGL-Tracks enthalten, die das Rendern der System-UI und nicht die interne Rendering-Pipeline Ihres Spiels darstellen. Wenn Sie Ihr Spiel isolieren möchten, entfernen Sie die Kommentarzeichen der optionalen Filter in der WHERE-Klausel der Haupt-SQL-Abfrage und ersetzen Sie 'com.example.mygame' durch den Paketnamen Ihres Spiels:

    -- AND p.name = 'com.example.mygame'
    -- AND t.name = 'RenderThread'
    
  • Aufwärmphase: Zeichnen Sie den Trace immer nach dem vollständigen Laden der 3D-Hauptszene des Spiels auf. Wenn Sie während Splash Screens oder Ladeübergängen Aufnahmen machen, kann dies zu irreführenden Initialisierungen führen.

Anforderungen an die Rückverfolgung von Ausnahmen für das LevelUp-Programm

Wenn Sie den Android Performance Analyzer (APA) verwenden, um einen Trace zu erfassen, der für eine Google Play Games LevelUp-Ausnahme infrage kommt, muss der Trace bestimmte Hardwareanforderungen erfüllen, um gültig zu sein.

Es wird dringend empfohlen, den Trace mit einem der Level Up-Referenzgeräte aufzunehmen.

Außerdem darf der Trace nicht auf einem Gerät mit einer ANGLE-GPU aufgenommen werden, damit die Validierung korrekt erfolgt. Die folgenden Geräte können nicht verwendet werden, um den LevelUp-Ausnahmetrace aufzuzeichnen:

  • Alle Geräte, bei denen der GPU-Anbieter SLSI (Samsung) ist und die AMD Xclipse-GPUs verwenden
  • Das Pixel 11