Durante lo sviluppo o l'ottimizzazione dei giochi per Android, spesso può essere utile
capire quale pipeline grafica utilizza il motore; i motori possono scegliere
Vulkan o GLES senza segnali chiaramente accessibili agli sviluppatori. Purtroppo,
in alcune situazioni affidarsi a logcat per verificare se un gioco
viene eseguito su Vulkan o è tornato automaticamente a OpenGL ES può essere inaffidabile.
Questa guida mostra come utilizzare Android Performance Analyzer (APA) e query SQL Perfetto personalizzate per identificare in modo definitivo l'API di rendering attiva di un gioco.
Limitazioni della verifica basata su log
- Log spogliati: le build di produzione spesso nascondono le impronte di inizializzazione e caricamento dei driver.
- Falsi positivi: alcuni motori di gioco 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 riesce a causa di problemi con i driver specifici del dispositivo, i motori spesso eseguono il fallback a OpenGL ES senza generare errori critici.
Misurare utilizzando l'APA
Utilizzando Android Performance Analyzer, puoi registrare una traccia di sistema e analizzare con precisione i dati dei frame tramite query SQL. Segui questi passaggi per misurare l'utilizzo di Vulkan e GLES:
Acquisire la traccia con APA: esegui il gioco e utilizza APA per acquisire una traccia di sistema durante il segmento che vuoi analizzare, ad esempio un punto durante il gameplay in cui sospetti cali di frame. Una volta collegato il dispositivo e completata la registrazione della traccia, i dati della traccia vengono caricati nell'interfaccia APA.
Fai clic sulla scheda SQL in APA: quando la schermata di analisi delle tracce è aperta, nel menu di navigazione dell'interfaccia utente, fai clic sulla scheda SQL per aprire l'ambiente del processore di tracce, dove puoi eseguire query sui dati direttamente.
Incolla la seguente query SQL nella scheda SQL APA: copia la seguente query SQL e incollala nel campo di immissione della query. Questa query analizza la traccia per gli eventi dell'API Drawing, come
eglSwapBuffers,QueuePresentKHRevkQueuePresentKHR. 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;Esegui la query: fai clic sul pulsante Esegui query vicino 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 conteggio delle presentazioni OpenGL ES (egl_count), il conteggio delle presentazioni Vulkan (vulkan_count), il conteggio totale delle presentazioni (total_count) e la percentuale di ciascuna API utilizzata (egl_percentage(%)evulkan_percentage(%)).
Schermata che mostra la query SQL eseguita e le metriche dell'API di rendering risultanti visualizzate in una tabella
Errori comuni
Evita
SurfaceFlingerconfusione: limita sempre la ricerca al thread dell'applicazione del tuo gioco (RenderThread). I processi di composizione a livello di sistema comeSurfaceFlingerpotrebbero mostrare tracce Vulkan o EGL che rappresentano il rendering dell'interfaccia utente di sistema, non la pipeline di rendering interna del tuo gioco. Per isolare il tuo gioco, rimuovi il commento dai filtri facoltativi nella clausolaWHEREdella query SQL principale e sostituisci'com.example.mygame'con il nome pacchetto del tuo gioco:-- AND p.name = 'com.example.mygame' -- AND t.name = 'RenderThread'Periodo di riscaldamento: registra sempre la traccia dopo il caricamento completo della scena 3D principale del gioco. L'acquisizione durante le schermate iniziali o le transizioni di caricamento potrebbe comportare inizializzazioni fuorvianti.
Requisiti di tracciamento dell'esenzione LevelUp
Se utilizzi Android Performance Analyzer (APA) per acquisire una traccia per ottenere l'esenzione da Google Play Games Level Up, esistono requisiti hardware specifici per la validità della traccia.
È preferibile acquisire la traccia utilizzando uno dei dispositivi di riferimento Level Up.
Inoltre, per garantire una convalida accurata, la traccia non deve essere eseguita su un dispositivo che utilizza una GPU ANGLE. In particolare, non puoi utilizzare i seguenti dispositivi per acquisire la traccia della tua esenzione LevelUp:
- Qualsiasi dispositivo in cui il fornitore della GPU è SLSI (Samsung), che utilizza GPU AMD Xclipse
- Pixel 11