Ao desenvolver ou otimizar jogos para Android, geralmente é útil
entender qual pipeline de gráficos seu mecanismo está usando. Os mecanismos podem escolher
o Vulkan ou o GLES sem indicadores claramente acessíveis ao desenvolvedor. Infelizmente,
há situações em que confiar em logcat para verificar se um jogo está
sendo executado no Vulkan ou se voltou silenciosamente para o OpenGL ES pode não ser confiável.
Neste guia, mostramos como usar o Android Performance Analyzer (APA) e consultas SQL personalizadas do Perfetto para identificar definitivamente a API de renderização ativa de um jogo.
Limitações da verificação baseada em registros
- Registros removidos: as versões de produção geralmente ocultam as pegadas de inicialização e carregamento de drivers.
- Falsos positivos: alguns mecanismos de jogo carregam as bibliotecas do Vulkan e do OpenGL ES durante a inicialização, imprimindo registros de inicialização para ambos, mesmo que um deles falhe e acione um substituto.
- Substituições silenciosas: se a inicialização do Vulkan falhar devido a problemas de driver específicos do dispositivo, os mecanismos geralmente vão usar o OpenGL ES sem gerar erros críticos.
Medir usando a APA
Com o Android Performance Analyzer, é possível gravar um rastreamento do sistema e analisar com precisão os dados de frames usando consultas SQL. Siga estas etapas para medir o uso do Vulkan e do GLES:
Capturar o rastro com o APA: execute o jogo e use o APA para capturar um rastreamento do sistema durante o segmento que você quer analisar, como um ponto durante o jogo em que você suspeita que haja quedas de frames. Depois que o dispositivo é conectado e a gravação do trace é concluída, os dados do trace são carregados na interface do APA.
Clique na guia SQL no APA: quando a tela de análise de trace estiver aberta, no menu de navegação da interface, clique na guia SQL para abrir o ambiente do processador de trace, onde é possível consultar os dados diretamente.
Cole a seguinte consulta SQL na guia "APA SQL": copie a consulta SQL abaixo e cole-a no campo de entrada de consulta. Essa consulta verifica o rastro em busca de eventos de API de desenho, como
eglSwapBuffers,QueuePresentKHRevkQueuePresentKHR. Ele os agrupa por nome de processo e calcula as contagens de API de renderização e a distribuição percentual de chamadas de renderização Vulkan versus 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;Execute a consulta: clique no botão Executar consulta perto do campo de entrada. Depois que a consulta é executada, uma tabela aparece no painel de resultados mostrando o nome do processo (
process_name), a contagem de apresentações do OpenGL ES (egl_count), a contagem de apresentações do Vulkan (vulkan_count), a contagem total de apresentações (total_count) e a porcentagem de cada API usada (egl_percentage(%)evulkan_percentage(%)).
Tela que mostra a consulta SQL executada e as métricas da API Rendering resultantes exibidas em uma tabela
Armadilhas comuns
Evite confusão com
SurfaceFlinger: sempre limite o escopo da pesquisa à linha de execução do aplicativo do jogo (RenderThread). Processos de composição em todo o sistema, comoSurfaceFlinger, podem mostrar faixas do Vulkan ou da EGL que representam a renderização da IU do sistema, não o pipeline de renderização interno do jogo. Para isolar seu jogo, remova a marca de comentário dos filtros opcionais na cláusulaWHEREda consulta SQL principal e substitua'com.example.mygame'pelo nome do pacote do jogo:-- AND p.name = 'com.example.mygame' -- AND t.name = 'RenderThread'Período de aquecimento: sempre registre o rastro depois que a cena 3D principal do jogo for totalmente carregada. A captura durante telas de apresentação ou transições de carregamento pode resultar em inicializações enganosas.
Requisitos de rastreamento de isenção do LevelUp
Se você estiver usando o Android Performance Analyzer (APA) para capturar um trace e se qualificar para uma isenção do LevelUp do Google Play Games, há requisitos de hardware específicos para que o trace seja válido.
É altamente recomendável que você capture o rastro usando um dos dispositivos de referência do Level Up.
Além disso, para garantir uma validação precisa, o trace não pode ser feito em um dispositivo que use uma GPU ANGLE. Especificamente, não é possível usar os seguintes dispositivos para capturar o rastro de isenção do LevelUp:
- Qualquer dispositivo em que o fornecedor da GPU seja SLSI (Samsung), que usa GPUs AMD Xclipse
- O Pixel 11