Cuando desarrollas o optimizas juegos para Android, a menudo puede ser útil comprender qué canalización de gráficos usa tu motor. Los motores pueden elegir Vulkan o GLES sin indicadores claramente accesibles para los desarrolladores. Desafortunadamente, hay situaciones en las que confiar en logcat para verificar si un juego se ejecuta en Vulkan o si recurrió silenciosamente a OpenGL ES puede ser poco confiable.
En esta guía, se muestra cómo usar el Android Performance Analyzer (APA) y las consultas SQL personalizadas de Perfetto para identificar de forma definitiva la API de renderización activa de un juego.
Limitaciones de la verificación basada en registros
- Registros despojados: Las compilaciones de producción suelen ocultar las huellas de inicialización y carga del controlador.
- Falsos positivos: Algunos motores de juegos cargan las bibliotecas de Vulkan y OpenGL ES durante el inicio, e imprimen registros de inicialización para ambas, incluso si una falla y activa una alternativa.
- Respaldo silencioso: Si la inicialización de Vulkan falla debido a problemas del controlador específicos del dispositivo, los motores suelen recurrir a OpenGL ES sin arrojar errores críticos.
Mediciones con APA
Con Android Performance Analyzer, puedes grabar un registro del sistema y analizar con precisión los datos de los fotogramas a través de consultas en SQL. Sigue estos pasos para medir tu uso de Vulkan y GLES:
Captura el registro con APA: Ejecuta tu juego y usa APA para capturar un registro del sistema durante el segmento que deseas analizar, como un punto durante el juego en el que sospechas que hay pérdidas de fotogramas. Una vez que el dispositivo se conecta y se completa la grabación del registro, los datos del registro se cargan en la interfaz de APA.
Haz clic en la pestaña SQL en APA: Cuando se abra la pantalla de análisis de registros, en el menú de navegación de la IU, haz clic en la pestaña SQL para abrir el entorno del procesador de registros, en el que puedes consultar los datos directamente.
Pega la siguiente consulta en SQL en la pestaña SQL de la APA: Copia la siguiente consulta en SQL y pégala en el campo de entrada de la consulta. Esta consulta analiza el registro para detectar eventos de la API de dibujo, como
eglSwapBuffers,QueuePresentKHRyvkQueuePresentKHR. Los agrupa por nombre de proceso y calcula los recuentos de la API de renderización y la distribución porcentual de las llamadas de renderización de Vulkan en comparación con 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;Ejecuta la consulta: Haz clic en el botón Ejecutar consulta cerca del campo de entrada. Después de que se ejecuta la consulta, aparece una tabla en el panel de resultados que muestra el nombre del proceso (
process_name), el recuento de presentaciones de OpenGL ES (egl_count), el recuento de presentaciones de Vulkan (vulkan_count), el recuento total de presentaciones (total_count) y el porcentaje de cada API utilizada (egl_percentage(%)yvulkan_percentage(%)).
Pantalla que muestra la consulta en SQL ejecutada y las métricas de la API de Renderización resultantes que se muestran en una tabla
Errores comunes
Evita la confusión con
SurfaceFlinger: Siempre limita tu búsqueda al subproceso de la aplicación de tu juego (RenderThread). Los procesos de composición en todo el sistema, comoSurfaceFlinger, pueden mostrar pistas de Vulkan o EGL que representan la renderización de la IU del sistema, no la canalización de renderización interna de tu juego. Para aislar tu juego, quita la marca de comentario de los filtros opcionales en la cláusulaWHEREde la consulta en SQL principal y reemplaza'com.example.mygame'por el nombre del paquete de tu juego:-- AND p.name = 'com.example.mygame' -- AND t.name = 'RenderThread'Período de calentamiento: Siempre registra el seguimiento después de que se haya cargado por completo la escena 3D principal del juego. La captura durante las pantallas de presentación o las transiciones de carga puede generar inicializaciones engañosas.
Requisitos de LevelUp Exemption Trace
Si usas Android Performance Analyzer (APA) para capturar un registro y calificar para una exención de LevelUp de Google Play Juegos, existen requisitos de hardware específicos para que el registro sea válido.
Es muy recomendable que captures tu registro con uno de los dispositivos de referencia de Level Up específicos.
Además, para garantizar una validación precisa, el registro no debe tomarse en un dispositivo que utilice una GPU de ANGLE. Específicamente, no puedes usar los siguientes dispositivos para capturar tu registro de exención de LevelUp:
- Cualquier dispositivo en el que el proveedor de la GPU sea SLSI (Samsung), que usa GPUs AMD Xclipse
- El Pixel 11