Hoy, nos complace presentarles una muestra de herramientas de desarrollo de Android para
Vulkan™. Vulkan es una nueva API de visualización 3D que ayudamos a desarrollar como miembros de Khronos, y está pensada para permitir que los desarrolladores controlen la unidad de procesamiento de gráficos (GPU) de forma explícita y con baja sobrecarga. La reducción de la sobrecarga que brinda Vulkan permite que para algunos benchmarks (valores de referencia) el procesamiento de llamadas a draw sea 10 veces superior en un solo núcleo, en comparación con OpenGL ES. Combinada con un diseño de API que admite subprocesos y permite el uso de varios núcleos en paralelo con alta eficacia, ofrece un considerable aumento del rendimiento para aplicaciones sujetas a un nivel elevado de llamadas a draw.
La compatibilidad con Vulkan ahora se encuentra disponible a través de la Android N Preview en dispositivos que la admiten, como Nexus 5X y Nexus 6P. (Por supuesto, igualmente podrán usar OpenGL ES).
A fin de ayudar a los desarrolladores para que comiencen a crear código de forma rápida, preparamos un conjunto de vínculo:
muestras y
guías que muestra la manera de usar Vulkan con eficiencia.
Pueden ver Vulkan en funcionamiento en un dispositivo Android con la demostración de Fish Tornado, de Robert Hodgin, adaptada por el equipo Art, Copy y Code de Google:
Optimización: La API Vulkan
Existen muchas similitudes entre OpenGL ES y Vulkan, pero Vulkan ofrece nuevas funciones para desarrolladores que necesiten aprovechar cada milisegundo.
- Control de la asignación de memoria a través de aplicaciones. Vulkan proporciona mecanismos para controlar en forma muy precisa la manera y el momento en que se asigna memoria en la GPU. Esto permite a los desarrolladores usar sus propias políticas de asignación y reciclaje conforme a sus aplicaciones, lo cual reduce en última instancia la sobrecarga de ejecución y memoria, y permite que las aplicaciones controlen los momentos en que se realizarán asignaciones exigentes.
- Generación de comandos asincrónicos. En OpenGL ES, las llamadas a draw se envían a la GPU en cuanto la aplicación las realiza. En Vulkan, en lugar de ello, la aplicación envía las llamadas a draw hacia los búferes de comandos. Esto permite que el trabajo de formar y registrar la llamada a draw se separe de la acción de enviarla a la GPU. Al distribuir la generación de comandos en varios subprocesos, las aplicaciones pueden usar de manera más eficaz varios núcleos de un CPU. Estos búferes de comandos también pueden reutilizarse, lo cual reduce la sobrecarga que implica la creación y emisión de comandos.
- Ausencia de procesos ocultos. Un inconveniente de OpenGL ES es que algunos comandos pueden activar procesos en puntos que no se detallan explícitamente en la especificación de la API, o que no resultan claros para el desarrollador. Vulkan hace que el rendimiento sea más predecible y uniforme al especificar los comandos que explícitamente activarán y no activarán procesos.
- Diseño multiproceso, desde el principio. Todas las aplicaciones con OpenGL ES deben emitir comandos para un contexto únicamente desde un subproceso para que la representación sea predecible y correcta. Por el contrario, Vulkan no tiene este requisito. Esto permite que las aplicaciones realicen tareas como la generación de búferes de comandos en paralelo, pero al mismo tiempo no establece de manera implícita certezas respecto de la modificación y lectura de datos de varios subprocesos al mismo tiempo. La aplicación tiene la capacidad y la tarea de administrar la sincronización de subprocesos.
- Funciones compatibles con dispositivos móviles. Vulkan cuenta con funciones de particular utilidad para obtener un alto rendimiento en GPU de representación en mosaicos, presentes en muchos dispositivos móviles. Las aplicaciones pueden proporcionar información sobre la interacción entre pasadas de representación separadas, lo cual permite que los GPU de representación en mosaicos usen un ancho de banda limitado en forma eficaz y eviten realizar lecturas externas.
- Compilación de sombreadores sin conexión. Vulkan requiere compatibilidad con SPIR-V, un lenguaje intermedio para sombreadores. Esto permite que los desarrolladores compilen sombreadores con anticipación e incluyan archivos binarios de SPIR-V con sus aplicaciones. Es más simple analizar estos archivos binarios que los lenguajes de alto nivel, como GLSL. Esto implica una menor variación en la manera en que los controladores realizan este análisis. SPIR-V también permite que, a través de terceros, se proporcionen compiladores para lenguajes de sombreado especializados o multiplataforma.
- Validación opcional. OpenGL ES valida todos los comandos llamados, y controla que los argumentos se encuentren dentro de los rangos esperados y que el estado de los objetos sea el indicado para la operación. Vulkan no realiza esta validación por su cuenta. Como alternativa, los desarrolladores pueden usar herramientas de depuración opcionales para asegurarse de que sus llamadas sean correctas y así evitar sobrecargas de tiempo de ejecución en el producto final.
Depuración: Capas de validación
Como se mencionó antes, la falta de validación implícita de Vulkan exige que los desarrolladores usen herramientas fuera de la API para validar su código. El mecanismo de capas de Vulkan permite que el código de validación y otras herramientas para desarrolladores inspeccionen cada llamada de API durante el desarrollo, sin sobrecargas para la versión de envío. En nuestras
guías se muestra la manera de crear capas de validación para Android NDK y se ofrecen las herramientas necesarias para crear código con Vulkan sin errores, de principio a fin.
Desarrollar: Cadena de herramientas de sombreadores
A través del conjunto de herramientas
Shaderc se proporcionan a los desarrolladores herramientas de tiempo de compilación y ejecución para compilar GLSL en SPIR-V. Se pueden compilar sombreadores en el tiempo de compilación mediante GLSLC, un compilador de línea de comandos, para facilitar la integración con sistemas de compilación existentes. A su vez, en el caso de sombreadores generados o editados durante la ejecución, los desarrolladores pueden usar la biblioteca de Shaderc para compilar sombreadores de GLSL en SPIR-V a través de una interfaz C. Ambas herramientas se incorporan como complemento del compilador de referencia de Khronos.