Identificare l'API di rendering dei giochi Vulkan rispetto a OpenGL ES

Durante lo sviluppo o l'ottimizzazione dei giochi per Android, spesso può essere utile capire quale pipeline grafica utilizza il tuo motore. I motori possono scegliere Vulkan o GLES senza indicatori chiaramente accessibili agli sviluppatori. Purtroppo, esistono situazioni in cui l'utilizzo di logcat per verificare se un gioco è in esecuzione su Vulkan o se è stato eseguito il fallback silenzioso a OpenGL ES può essere inaffidabile.

Questa guida mostra come utilizzare Android Performance Analyzer (APA) e le query SQL Perfetto personalizzate per identificare in modo definitivo l'API di rendering attiva di un gioco.

Limitazioni della verifica basata su log

  • Log rimossi: le build di produzione spesso nascondono le tracce di inizializzazione e caricamento dei driver.
  • Falsi positivi: alcuni motori grafici caricano le librerie Vulkan e OpenGL ES durante l'avvio, stampando i log di inizializzazione per entrambe, anche se una alla fine non va a buon fine e attiva un fallback.
  • Fallback silenziosi: se l'inizializzazione di Vulkan non va a buon fine a causa di problemi dei driver specifici del dispositivo, i motori spesso eseguono il fallback a OpenGL ES senza generare errori critici.

Misura utilizzando l'APA

Utilizzando Android Performance Analyzer, puoi registrare un tracciamento del sistema e analizzare con precisione i dati dei frame tramite query SQL. Segui questi passaggi per misurare l'utilizzo di Vulkan e GLES:

  1. Acquisisci il tracciamento del sistema con APA: esegui il gioco e utilizza APA per acquisire un tracciamento del sistema durante il segmento che vuoi analizzare, ad esempio un punto durante il gameplay in cui sospetti che si verifichino cali di frame. Una volta connesso il dispositivo e completata la registrazione della traccia, i dati della traccia vengono caricati nell'interfaccia di APA.

  2. Fai clic sulla scheda SQL in APA: quando la schermata di analisi della traccia è aperta, nel menu di navigazione della UI, fai clic sulla scheda SQL per aprire l'ambiente del processore di traccia, dove puoi eseguire query direttamente sui dati.

  3. Incolla la seguente query SQL nella scheda APA SQL: copia la seguente query SQL e incollala nel campo di immissione della query. Questa query analizza la traccia per gli eventi API di disegno, come eglSwapBuffers, QueuePresentKHR e vkQueuePresentKHR. Li raggruppa per nome del processo e calcola i conteggi delle API di rendering e la distribuzione percentuale delle chiamate di rendering Vulkan rispetto a 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. Esegui la query: fai clic sul pulsante Esegui query accanto al campo di immissione. Dopo l'esecuzione della query, nel riquadro dei risultati viene visualizzata una tabella che mostra il nome del processo (process_name), il numero di presentazioni OpenGL ES (egl_count), il numero di presentazioni Vulkan (vulkan_count), il numero totale di presentazioni (total_count) e la percentuale di ogni API utilizzata (egl_percentage(%) e vulkan_percentage(%)).

    Schermata che mostra la query SQL eseguita e le metriche dell'API di rendering risultanti visualizzate in una tabella

Errori comuni

  • Evita la confusione con SurfaceFlinger: limita sempre l'ambito della ricerca al thread dell'applicazione del gioco (RenderThread). I processi di composizione a livello di sistema come SurfaceFlinger potrebbero mostrare tracce Vulkan o EGL che rappresentano il rendering della UI di sistema, non la pipeline di rendering interna del gioco. Per isolare il tuo gioco, rimuovi il commento dai filtri facoltativi nella clausola WHERE della query SQL principale e sostituisci 'com.example.mygame' con il nome del pacchetto del tuo gioco:

    -- AND p.name = 'com.example.mygame'
    -- AND t.name = 'RenderThread'
    
  • Periodo di riscaldamento: registra sempre la traccia dopo che la scena 3D principale del gioco è stata caricata completamente. L'acquisizione durante le schermate iniziali o le transizioni di caricamento potrebbe comportare inizializzazioni fuorvianti.

Requisiti per la traccia di esenzione LevelUp

Se utilizzi Android Performance Analyzer (APA) per acquisire una traccia per ottenere l'idoneità per un'esenzione di Google Play Games LevelUp, esistono requisiti hardware specifici per la validità della traccia.

È preferibile acquisire la traccia utilizzando uno dei dispositivi di riferimento di Level Up.

Inoltre, per garantire una convalida accurata, la traccia non deve essere acquisita su un dispositivo che utilizza una GPU ANGLE. In particolare, non puoi utilizzare i seguenti dispositivi per acquisire la traccia di esenzione LevelUp:

  • Qualsiasi dispositivo in cui il fornitore della GPU è SLSI (Samsung), che utilizza GPU AMD Xclipse
  • Pixel 11