- Desde OBS Studio 32.0.0 para macOS, se agregó de forma experimental un backend de renderizado basado en Apple Metal, con el objetivo de mejorar el rendimiento y la eficiencia frente a OpenGL
- Metal es una API diseñada para ofrecer menor sobrecarga y reflejar la arquitectura moderna de las GPU, por lo que OBS modificó de forma fundamental su manera de interactuar con la GPU para poder soportarla
- Como el renderizador existente de OBS estaba centrado en una arquitectura orientada a Direct3D, el backend de Metal requirió un amplio trabajo de compatibilidad en áreas como conversión de shaders y gestión de recursos
- En particular, incluye una implementación compleja que convierte shaders HLSL a MSL en tiempo real y simula dentro de Metal el comportamiento de
map/unmap de Direct3D
- El backend de Metal sigue en etapa “experimental”, pero representa un punto de inflexión importante para mejorar el entorno de desarrollo en macOS con mejor rendimiento que OpenGL, una estructura de código más segura basada en Swift y soporte para vista previa EDR
Resumen de la incorporación del renderizador Metal
- A partir de OBS Studio 32.0.0, en macOS se ofrece de forma experimental un renderizador basado en la API gráfica Metal
- Busca ser una alternativa al backend actual de OpenGL, con el objetivo de mejorar el rendimiento y la eficiencia
- Metal es una API moderna que cambia de raíz la forma de interactuar con la GPU, y OBS ajustó su estructura interna para adaptarse a ello
- El backend de Metal aparece marcado como “Experimental” y tiene algunos problemas y limitaciones conocidos
- El renderizador OpenGL sigue siendo el valor predeterminado, y los usuarios pueden probar manualmente la versión con Metal
- Se invita a desarrolladores con experiencia en Metal a participar con feedback y Pull Requests
Contexto de Metal y filosofía de diseño
- Apple presentó Metal por primera vez en 2014 para iPhone y lo extendió a Mac en 2015
- En ese momento, Metal fue una de las primeras API gráficas de nueva generación compatibles con GPU de Intel, AMD y NVIDIA
- Metal combina ideas de Mantle de AMD con conceptos de OpenGL y Direct3D, pero fue rediseñada eliminando elementos heredados
- Su API basada en Objective-C y Swift ofrece una estructura familiar para desarrolladores de iOS y macOS
- Dentro de Xcode, incluye soporte integrado para depuración de shaders y análisis de GPU
Diferencias de diseño de API y adaptación del renderizador de OBS
- En OpenGL y Direct3D tradicionales, la API manejaba automáticamente la gestión de recursos y la sincronización, pero
las API modernas como Metal exigen que el desarrollador lo administre directamente
- Las API nuevas tratan a la GPU como un dispositivo de procesamiento basado en colas de comandos paralelas, y administran el estado del pipeline con objetos inmutables
- Como el renderizador existente de OBS estaba diseñado para el modelo de Direct3D,
se implementó una capa de compatibilidad a nivel de backend para soportar Metal
Estructura del renderizador de OBS y problemas de compatibilidad con Metal
- OBS usa backends por plataforma: Direct3D (Windows) y OpenGL (Linux/macOS)
- Aunque el núcleo del renderizador es independiente de la API, existen algunas suposiciones centradas en Direct3D
- Principales restricciones
- Los shaders están escritos en HLSL, por lo que necesitan conversión en tiempo de ejecución
- Hay uso de variables globales, suposiciones de ejecución secuencial y manejo de texturas al estilo Direct3D
- La renderización de vista previa depende del modelo “discard” de DXGI
Conversión de shaders (Transpiling Shaders)
- Los archivos de efectos de OBS están escritos en HLSL y se transforman según la API de destino
- Para soportar Metal, se agregó un convertidor de HLSL → MSL
- Diferencias principales
- MSL requiere separar las estructuras de entrada y salida y no admite variables globales
- Todos los datos uniform deben enviarse mediante buffers de GPU, por lo que deben pasarse explícitamente como argumentos de función
- Al invocar funciones, la coincidencia de tipos y la validación de firmas son estrictas
- El convertidor reescribe parcialmente el código de shaders en tiempo de ejecución para ajustarlo a las reglas de MSL
- Por ejemplo, convierte variables
uniform de HLSL en constant buffer de MSL
- También inserta automáticamente lógica de conversión de tipos, como
int3 → uint2 + uint
Simulación del comportamiento de Direct3D
- El renderizador de OBS fue diseñado asumiendo el comportamiento
map/unmap de Direct3D
- Como Metal no proporciona esta sincronización automática, el backend tuvo que implementarla directamente
- Modo de operación del backend de Metal
- Al escribir, crea buffers de GPU y los comparte directamente con la memoria de CPU
- En
unmap, programa un comando de blit de GPU para copiar hacia la textura
- Al leer, también comparte el buffer de GPU, pero evita conflictos mediante sincronización explícita
- En la práctica, esto reproduce dentro de Metal las funciones de seguimiento de recursos y sincronización de Direct3D
Problema de renderización de vista previa y solución temporal
- La Metal Layer de macOS, a diferencia de DXGI, no permite que la app presente cuadros arbitrariamente
- El sistema controla la velocidad de cuadros según ProMotion y el modo de bajo consumo
- Como el bucle de renderizado propio de OBS no coincide con el ciclo de presentación de macOS, se produce latencia en la vista previa
- Solución temporal
- OBS primero renderiza a una textura virtual y luego un hilo separado la copia a la Surface de pantalla
- Este proceso requiere sincronización de GPU y puede generar desajustes entre cuadros
- A partir de macOS 14, se prevén desafíos adicionales por los temporizadores independientes por ventana
El costo oculto de las API gráficas modernas
- El desarrollo del backend de Metal pasó por meses de investigación y diseño iterativo
- Esto demuestra por qué pueden surgir caídas de rendimiento en transiciones como OpenGL→Vulkan o D3D11→D3D12
- En las API modernas, la aplicación debe hacer directamente lo que antes resolvía el driver
- Se requiere una comprensión profunda del funcionamiento de la GPU y de las dependencias entre comandos
- Aunque el backend de Metal reintrodujo parte de la sobrecarga, ofrece ventajas como
- Rendimiento comparable o superior a OpenGL
- Potentes herramientas de análisis, como depuración de shaders y texturas
- Una estructura de código más segura basada en Swift
- Soporte de vista previa EDR para procesamiento de video de alta calidad
- Gracias a las funciones de análisis integradas de Xcode, mejora la eficiencia del mantenimiento de OBS en macOS, y se solicita feedback de desarrolladores para en el futuro convertir Metal en el renderizador predeterminado
1 comentarios
Comentarios de Hacker News
Fue un artículo realmente muy bueno. La explicación de cómo manejan los shaders me sorprendió muchísimo
Me dejó con la duda de si de verdad hay que pasar por un proceso así para que los shaders de plugins de terceros funcionen en múltiples backends, o si terminó siendo así por mantener la compatibilidad hacia atrás
Decirle a desarrolladores externos “escríbanlo por separado en cada lenguaje de shaders” quizá sea fácil desde la perspectiva del equipo central, pero en la práctica no es deseable
A todos les parece ineficiente, pero en la práctica no hay alternativa
El título del artículo oculta el punto principal
Debería cambiarse por algo como “OBS Studio adopta un nuevo renderizador: el proceso de adoptar Metal”
Esto muestra claramente el costo de que Apple haya creado una API propia para proteger su ecosistema en vez de usar Vulkan
OBS Studio añadió soporte para Vulkan en marzo de 2020, en la versión 25.0. Ya pasaron cinco años y medio
En entornos embebidos todavía domina OpenGL ES
No soy experto en este tema. Entendí quizá solo un 5% de lo que leí, pero me gustaría que hubiera más artículos con este nivel de detalle técnico
Los simples comunicados se sienten como marketing
En lo personal me entusiasma más el próximo soporte para VST3, pero esta noticia también me da gusto
Es muchísimo más fácil que configurar codificación por hardware en un SoC de Rockchip
Me pareció interesante la explicación de que Metal lleva un paso más allá el enfoque orientado a objetos de Direct3D, combinándolo con el diseño de API “verboso” de Objective-C y Swift
Sorprende que una API de gráficos 3D a nivel de sistema operativo pueda estar construida sobre un enfoque basado en lenguajes dinámicos
Supongo que eso es posible gracias a las optimizaciones de
objc_msgSend()Vulkan/Metal/DirectX 12 envían múltiples comandos dentro de buffers de comandos en lugar de hacer llamadas individuales
A comienzos de los 2000 había libros sobre cómo usar Direct3D desde C#, y eso cambió la percepción de que también se podían hacer gráficos de alto rendimiento en lenguajes con GC
La clave es una estructura de procesamiento por lotes que referencia buffers preasignados para minimizar la sobrecarga del runtime
Desde Cocoa, la mayor parte se escribe en un subconjunto restringido de C++ (por ejemplo, IOKit)
Ojalá que las API modernas de GPU sean una etapa de transición hacia algo más simple
Mi relación con OpenGL es de amor y odio, pero después de usar las API nuevas terminé extrañando la simplicidad de OpenGL
Me pregunto si Metal mejorará el rendimiento incluso en las Mac Intel antiguas, o si es una optimización solo para la serie M
Pero Metal 3 todavía es compatible con varias Mac Intel, así que queda la duda de por qué lo limitaron
Estaba pensando en armar un equipo de streaming con una Mac Mini
Me pregunto si con esta mejora de rendimiento ya será suficientemente viable
Si son juegos arcade 2D o pantallas de desarrollo, no debería haber problema
Si son juegos AAA modernos, es mejor capturar la pantalla de una PC con una capturadora
Por ahí de 2017 hacer streaming desde macOS era difícil, pero hoy con la serie M alcanza sin problema
Con esta mejora se espera todavía más eficiencia
Ojalá Apple invirtiera más recursos para aumentar los casos de éxito externos de Metal
Fuera de Apple, Metal todavía no ha tenido un gran éxito