- À partir d’OBS Studio 32.0.0 pour macOS, un backend de rendu basé sur Apple Metal a été ajouté à titre expérimental, avec pour objectif d’améliorer les performances et l’efficacité par rapport à OpenGL
- Metal est une API conçue pour offrir une faible surcharge et refléter l’architecture moderne des GPU ; pour le prendre en charge, OBS a dû modifier en profondeur sa manière d’interagir avec le GPU
- Comme le moteur de rendu existant d’OBS reposait sur une architecture centrée sur Direct3D, le backend Metal a nécessité un important travail de compatibilité sur des aspects comme la conversion des shaders et la gestion des ressources
- En particulier, il comprend une implémentation complexe qui convertit à la volée les shaders HLSL en MSL et simule dans Metal le comportement
map/unmapde Direct3D - Le backend Metal est encore au stade « expérimental », mais avec des performances supérieures à OpenGL, une structure de code plus sûre basée sur Swift et la prise en charge de l’aperçu EDR, il marque un tournant important pour l’environnement de développement macOS
Aperçu de l’introduction du moteur de rendu Metal
- À partir d’OBS Studio 32.0.0, un moteur de rendu basé sur l’API graphique Metal est proposé à titre expérimental sur macOS
- Il vise à améliorer les performances et l’efficacité comme alternative au backend OpenGL existant
- Metal est une API moderne qui change fondamentalement la façon d’interagir avec le GPU, et OBS a ajusté sa structure interne en conséquence
- Le backend Metal est indiqué comme « Experimental » et présente certains problèmes connus ainsi que des limitations
- Le moteur OpenGL reste la valeur par défaut, et les utilisateurs peuvent tester eux-mêmes la version Metal
- Les développeurs ayant de l’expérience avec Metal sont invités à contribuer via leurs retours et des Pull Requests
Contexte et philosophie de conception de Metal
- Apple a présenté Metal pour la première fois en 2014 sur iPhone, puis l’a étendu au Mac en 2015
- À l’époque, Metal était l’une des premières API graphiques de nouvelle génération à prendre en charge à la fois les GPU Intel, AMD et NVIDIA
- Metal combine des concepts d’AMD Mantle et d’OpenGL/Direct3D, tout en étant repensé pour supprimer les éléments hérités
- Son API, basée sur Objective-C et Swift, offre une structure familière aux développeurs iOS et macOS
- Xcode fournit une prise en charge intégrée du débogage des shaders et de l’analyse GPU
Différences de conception des API et adaptation du moteur de rendu d’OBS
- Les anciens modèles OpenGL et Direct3D laissaient à l’API la gestion automatique des ressources et de la synchronisation, alors que
les API modernes comme Metal exigent une gestion directe par les développeurs - Les nouvelles API traitent le GPU comme un processeur à files de commandes parallèles et gèrent l’état du pipeline sous forme d’objets immuables
- Le moteur de rendu existant d’OBS ayant été conçu selon le modèle Direct3D,
la prise en charge de Metal a nécessité la mise en place d’une couche de compatibilité au niveau du backend
Structure du moteur de rendu d’OBS et problèmes de compatibilité avec Metal
- Selon la plateforme, OBS utilise les backends Direct3D (Windows) et OpenGL (Linux/macOS)
- Le cœur du moteur de rendu est indépendant de l’API, mais certaines hypothèses restent centrées sur Direct3D
- Principales contraintes
- Les shaders sont écrits en HLSL, ce qui impose une conversion à l’exécution
- Utilisation de variables globales, hypothèse d’exécution séquentielle, gestion des textures de type Direct3D, etc.
- Le rendu de l’aperçu dépend du modèle « discard » de DXGI
Conversion des shaders (Transpiling Shaders)
- Les fichiers d’effets d’OBS sont écrits en HLSL et convertis selon l’API cible
- Pour prendre en charge Metal, un convertisseur HLSL → MSL a été ajouté
- Principales différences
- MSL impose de séparer les structures d’entrée et de sortie et ne prend pas en charge les variables globales
- Toutes les données uniform doivent être transmises via des buffers GPU, avec un passage explicite en arguments de fonction
- Lors des appels de fonction, la correspondance des types et la validation des signatures sont strictes
- Le convertisseur réécrit partiellement le code des shaders à l’exécution pour respecter les règles de MSL
- Par exemple, les variables
uniformde HLSL sont converties enconstant bufferde MSL - Une logique de conversion de types est automatiquement insérée, comme
int3→uint2+uint
- Par exemple, les variables
Simulation du comportement Direct3D
- Le moteur de rendu d’OBS a été conçu en supposant le comportement
map/unmapde Direct3D- Comme Metal ne fournit pas cette synchronisation automatique, le backend l’implémente directement
- Méthode de traitement du backend Metal
- En écriture, il crée un buffer GPU et le partage directement avec la mémoire CPU
- Lors du
unmap, il programme une commande GPU de blit pour copier les données vers la texture - En lecture, il partage également un buffer GPU, mais évite les conflits grâce à une synchronisation explicite
- En conséquence, les fonctions de suivi des ressources et de synchronisation propres à Direct3D sont reproduites à l’intérieur de Metal
Problème de rendu de l’aperçu et solution temporaire
- Sur macOS, la Metal Layer ne permet pas à l’application d’afficher librement les images, contrairement à DXGI
- Le système contrôle la fréquence d’affichage en fonction de ProMotion et du mode basse consommation
- OBS subit une latence d’aperçu en raison du décalage entre sa propre boucle de rendu et le cycle d’affichage de macOS
- Solution temporaire
- OBS effectue d’abord le rendu dans une texture virtuelle, puis un thread séparé la copie vers la surface d’affichage
- Ce processus exige une synchronisation GPU et laisse subsister un risque de désalignement entre les images
- À partir de macOS 14, des défis supplémentaires sont attendus en raison des timers indépendants par fenêtre
Le coût caché des API graphiques modernes
- Le développement du backend Metal a nécessité plusieurs mois de recherche et d’itérations de conception
- Cela illustre concrètement pourquoi les transitions OpenGL→Vulkan ou D3D11→D3D12 peuvent entraîner des baisses de performances
- Avec les API modernes, l’application doit prendre en charge elle-même ce que faisait auparavant le pilote
- Cela demande une compréhension approfondie du fonctionnement du GPU et des dépendances entre commandes
- Le backend Metal réintroduit une partie de la surcharge, mais apporte les avantages suivants
- Des performances équivalentes ou supérieures à OpenGL
- De puissantes fonctions d’analyse, comme le débogage des shaders et des textures
- Une structure de code plus sûre basée sur Swift
- La prise en charge de l’aperçu EDR, permettant un traitement vidéo de haute qualité
- Grâce aux fonctions d’analyse intégrées de Xcode, l’efficacité de maintenance d’OBS sur macOS s’améliore, et l’équipe sollicite les retours des développeurs en vue d’un futur basculement de Metal comme moteur de rendu par défaut
1 commentaires
Commentaires Hacker News
C’était un très bon article. L’explication de la façon dont les shaders sont gérés était vraiment impressionnante.
Je me demande s’il faut réellement passer par un tel processus pour faire fonctionner les shaders de plugins tiers sur plusieurs backends, ou si c’est surtout dû au maintien de la rétrocompatibilité.
Dire aux développeurs externes de « tout réécrire dans chaque langage de shader » serait peut-être simple du point de vue de l’équipe cœur, mais en pratique ce n’est pas souhaitable.
Tout le monde trouve ça inefficace, mais en pratique il n’y a pas d’alternative.
Le titre de l’article masque l’essentiel.
Il faudrait plutôt quelque chose comme : « OBS Studio adopte un nouveau moteur de rendu : comment OBS a adopté Metal »
Cela montre clairement le prix à payer quand Apple crée une API pour protéger son propre écosystème au lieu d’adopter Vulkan.
OBS Studio a ajouté la prise en charge de Vulkan en mars 2020, avec la version 25.0. Cela fait déjà cinq ans et demi.
Dans l’embarqué, OpenGL ES reste encore dominant.
Je ne suis pas expert sur le sujet. Je n’ai compris qu’environ 5 % de ce que j’ai lu, mais j’aimerais voir plus d’articles contenant ce type de détails techniques.
Les simples annonces finissent par ressembler à du marketing.
Personnellement, j’attends davantage avec impatience la future prise en charge de VST3, mais cette nouvelle me réjouit aussi.
C’est bien plus simple que de configurer l’encodage matériel sur un SoC Rockchip.
J’ai trouvé intéressante l’explication selon laquelle Metal pousse encore plus loin l’approche orientée objet de Direct3D, en la combinant avec le design d’API « verbeux » d’Objective-C et de Swift.
C’est surprenant qu’une API graphique 3D au niveau du système d’exploitation puisse être conçue sur une base aussi dynamique.
Je suppose que c’est grâce aux optimisations de
objc_msgSend().Vulkan/Metal/DirectX 12 envoient de nombreuses commandes via des buffers de commandes au lieu de faire des appels individuels.
Il existait au début des années 2000 un livre sur l’utilisation de Direct3D en C#, qui a changé la perception selon laquelle des graphiques haute performance étaient possibles même avec un langage à GC.
L’essentiel est de minimiser le surcoût du runtime grâce à une structure de traitement par lots qui référence des buffers préalloués.
Depuis Cocoa, la plupart des composants sont écrits dans un sous-ensemble restreint de C++ (par exemple IOKit).
J’espère que les API GPU modernes ne sont qu’une étape transitoire vers quelque chose de plus simple.
J’entretiens une relation d’amour-haine avec OpenGL, mais après avoir utilisé les nouvelles API, la simplicité d’OpenGL me manque presque.
Je me demande si Metal améliorera aussi les performances sur les anciens Mac Intel, ou si l’optimisation est réservée aux puces de la série M.
Mais Metal 3 est toujours pris en charge sur plusieurs Mac Intel, donc je me demande pourquoi ils ont mis cette restriction.
J’envisageais de monter une configuration de streaming avec un Mac Mini.
Je me demande si ce gain de performances le rendra suffisamment viable.
Pour des jeux d’arcade 2D ou un écran de développement, aucun problème.
Pour des jeux AAA récents, mieux vaut récupérer l’image du PC via une carte de capture.
Vers 2017, faire du streaming sous macOS était difficile, mais aujourd’hui, une machine de la série M suffit largement.
On peut s’attendre à ce que cette amélioration augmente encore l’efficacité.
J’aimerais qu’Apple investisse davantage de ressources pour multiplier les succès externes de Metal.
En dehors d’Apple, Metal n’a pas encore connu de grand succès.