Cuando desarrollas o mejoras juegos para Android, suele ser útil comprender qué canalización de gráficos usa tu motor. Los motores pueden elegir Vulkan o GLES sin indicadores claros a los que puedan acceder los desarrolladores. Lamentablemente,
hay situaciones en las que confiar en logcat para verificar si un juego se
ejecuta en Vulkan o si recurrió a OpenGL ES de forma silenciosa puede no ser confiable.
En esta guía, se muestra cómo usar el Android Performance Analyzer (APA) y las consultas en SQL de Perfetto personalizadas para identificar de forma definitiva la API de renderización activa de un juego.
Limitaciones de la verificación basada en registros
- Registros eliminados: Las compilaciones de producción suelen ocultar las huellas de inicialización y carga de controladores.
- Falsos positivos: Algunos motores de juegos cargan las bibliotecas de Vulkan y OpenGL ES durante el inicio, lo que imprime registros de inicialización para ambos, incluso si uno falla y activa un resguardo.
- Resguardos silenciosos: Si la inicialización de Vulkan falla debido a problemas con el controlador específicos del dispositivo, los motores suelen recurrir a OpenGL ES sin arrojar errores críticos.
Medición con APA
Con Android Performance Analyzer, puedes grabar un seguimiento del sistema y analizar con precisión los datos de 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 quieras analizar, como un punto durante el juego en el que sospeches que se pierden fotogramas. Una vez que el dispositivo esté conectado y se complete la grabación del seguimiento, los datos de seguimiento se cargarán en la interfaz de APA.
Haz clic en la pestaña SQL en APA: Cuando la pantalla de análisis de seguimiento esté abierta, en el menú de navegación de la IU, haz clic en la pestaña SQL para abrir el entorno del procesador de seguimiento, en el que puedes consultar los datos directamente.
Pega la siguiente consulta en SQL en la pestaña APA SQL: Copia la siguiente consulta en SQL y pégala en el campo de entrada de la consulta. Esta consulta analiza el seguimiento en busca de 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 las de 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 que se encuentra 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 usada (egl_percentage(%)yvulkan_percentage(%)).
Pantalla que muestra la consulta en SQL ejecutada y las métricas de la API de renderización resultantes en una tabla
Errores comunes
Evita la confusión de
SurfaceFlinger: Siempre limita la búsqueda al subproceso de la aplicación de tu juego (RenderThread). Los procesos de composición de 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 el 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 preparación: Siempre registra el seguimiento después de que se haya cargado por completo la escena principal en 3D del juego. La captura durante las pantallas de presentación o las transiciones de carga puede generar inicializaciones engañosas.
Requisitos de seguimiento de exenciones de LevelUp
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.
Se recomienda que captures el registro con uno de los dispositivos de referencia de Level Up de destino.
Además, para garantizar una validación precisa, no se debe realizar el seguimiento en un dispositivo que use una GPU de ANGLE. Específicamente, no puedes usar los siguientes dispositivos para capturar tu seguimiento de exención de LevelUp:
- Cualquier dispositivo en el que el proveedor de GPU sea SLSI (Samsung), que usa GPU AMD Xclipse
- El Pixel 11