Ao desenvolver ou otimizar jogos para Android, é útil entender qual pipeline de gráficos o mecanismo está usando. Os mecanismos podem escolher Vulkan ou GLES sem indicadores claramente acessíveis aos desenvolvedores. 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.
Este guia mostra 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 com base em registros
- Registros removidos: builds de produção geralmente ocultam a inicialização e pegadas de carregamento de driver.
- Falsos positivos: alguns mecanismos de jogos carregam as bibliotecas Vulkan e OpenGL ES durante a inicialização, imprimindo registros de inicialização para ambos, mesmo que um falhe e acione um fallback.
- Substituições silenciosas: se a inicialização do Vulkan falhar devido a problemas de driver específicos do dispositivo, os mecanismos geralmente farão fallback para 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 seu uso do Vulkan e do GLES:
Capture o rastreamento 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 a jogabilidade em que você suspeita de quedas de frames. Depois que o dispositivo estiver conectado e a gravação de rastreamento for concluída, os dados de rastreamento serão carregados na interface do APA.
Clique na guia "SQL" no APA: quando a tela de análise de rastreamento estiver aberta, no menu de navegação da interface, clique na guia SQL para abrir o ambiente do processador de rastreamento, onde é possível consultar os dados diretamente.
Cole a seguinte consulta SQL na guia SQL do APA: copie a consulta SQL a seguir e cole no campo de entrada de consulta. Essa consulta verifica o rastreamento em busca de eventos da API de desenho, como
eglSwapBuffers,QueuePresentKHRevkQueuePresentKHR. Ele os agrupa por nome do processo e calcula as contagens da API de renderização e a distribuição percentual das chamadas de renderização do Vulkan em comparação com o 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;Executar 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ção do OpenGL ES (egl_count), a contagem de apresentação do Vulkan (vulkan_count), a contagem total de apresentações (total_count) e a porcentagem de cada API usada (egl_percentage(%)evulkan_percentage(%)).
Tela mostrando 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 sua pesquisa à thread de aplicativo do jogo (RenderThread). Processos de composição em todo o sistema comoSurfaceFlingerpodem mostrar rastreamentos do Vulkan ou do EGL que representam a renderização da interface do sistema, não o pipeline de renderização interna do jogo. Para isolar seu jogo, remova o 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 rastreamento depois que a cena 3D principal do jogo for totalmente carregada. Capturar 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 rastreamento e se qualificar para uma isenção do LevelUp do Google Play Games, há requisitos específicos de hardware para que o rastreamento seja válido.
É altamente recomendável que você capture o rastreamento usando um dos dispositivos de referência do Level Up.
Além disso, para garantir uma validação precisa, o rastreamento não pode ser feito em um dispositivo que usa uma GPU ANGLE. Especificamente, não é possível usar os seguintes dispositivos para capturar o rastro da sua exceção do LevelUp:
- Qualquer dispositivo em que o fornecedor da GPU seja SLSI (Samsung), que usa GPUs AMD Xclipse
- O Pixel 11