Lorsque vous créez un moteur de rendu qui prend en charge plusieurs API graphiques, vous voudrez généralement résumer votre code dans une sorte de bibliothèque de bas niveau liée à certaines API graphiques comme OpenGL, Vulkan, D3D11 et ainsi de suite;
Ils fonctionnent très différemment les uns des autres, il est donc essentiel de créer une bonne API générique; J'ai lu que vous souhaitiez généralement utiliser un "back-end" qui implémente les fonctionnalités de base pour chaque API que vous souhaitez prendre en charge, et un "front-end" qui est ce qui est utilisé par le programmeur pour dessiner des éléments sur le écran.
Comment savoir si je fais trop d'abstraction serrée?
graphics-programming
Gabriele Vierti
la source
la source
Réponses:
Tout d'abord, demandez-vous si cela en vaut la peine de prendre en charge plusieurs API graphiques. L'utilisation d'OpenGL couvrira la plupart des plates-formes et sera "assez bonne" pour tous les projets, sauf les plus ambitieux graphiquement. À moins que vous ne travailliez pour un très grand studio de jeu qui peut se permettre de consacrer plusieurs milliers d'heures-personnes à la mise en œuvre et au test de plusieurs backends de rendu et à moins qu'il n'y ait des fonctionnalités spécifiques à DirectX ou Vulcan, vous avez vraiment voulez montrer, cela ne vaut généralement pas la peine . Surtout si l'on considère que vous pouvez économiser beaucoup de travail en utilisant une couche d'abstraction créée par quelqu'un d'autre (une bibliothèque ou un moteur de jeu tiers).
Mais supposons que vous ayez déjà évalué vos options et êtes arrivé à la conclusion qu'il est à la fois viable et vaut le temps de lancer la vôtre.
Ensuite, les principaux programmeurs sont le juge principal de l'architecture logicielle de votre couche d'abstraction.
Si oui, vous avez réussi.
la source
Commencez par identifier ce dont vous avez réellement besoin dans la partie «wrapper» de l'API. C'est généralement très, très simple: vous avez besoin des ressources de base (tampons, shaders, textures, état du pipeline) et d'un moyen d'utiliser ces ressources pour construire un cadre en soumettant des appels de tirage.
Essayez de garder toute logique de haut niveau hors de la partie wrapper de l'API. Si vous implémentez une technique d'élimination de scène intelligente dans cette partie de l'API, vous êtes maintenant prêt à dupliquer cette logique dans toutes les implémentations du backend. C'est beaucoup d'efforts supplémentaires, alors restez simple. La gestion de scène doit faire partie d'une partie de niveau supérieur de l'API qui utilise l'encapsuleur plutôt que de faire partie de l'encapsuleur lui-même.
Choisissez les cibles que vous soutiendrez et comprenez-les. Il est difficile d'écrire des wrappers décents pour «tout», et vous n'avez probablement pas besoin de le faire (sans doute vous n'avez pas besoin d'écrire un seul wrapper, comme indiqué dans la réponse de Philipp ). Il est presque impossible d'écrire un wrapper décent si vous ne connaissez pas déjà les API que vous allez encapsuler.
Évaluez régulièrement l'état de votre API. Il doit en général avoir une surface plus petite que les API enveloppées sous-jacentes; si vous vous trouvez à créer des types de wrapper un à un pour chaque structure D3D ou chaque appel de fonction OpenGL, vous vous éloignez probablement du cap.
Regardez ce qui s'est passé auparavant. Sokol et BGFX sont des API qui fournissent des niveaux d'agnosticisme qui peuvent vous être utiles et sont relativement faciles à comprendre (les premiers en particulier).
la source
Un autre point qui n'a pas encore été mentionné et que vous devez prendre en compte est vos objectifs de performance. Si votre objectif est d'avoir une bibliothèque graphique qui donnera de bonnes performances sur une plate-forme matérielle bon marché, mais également utilisable sur une variété de plates-formes qui sont beaucoup plus puissantes mais utilisent une API différente, il peut être judicieux de concevoir votre API autour quelles que soient les abstractions utilisées nativement sur la plateforme où les performances sont un problème. Même si cela entraîne une dégradation de la vitesse de 50% sur les plates-formes les plus puissantes, cela peut valoir la peine s'il permet une amélioration de la vitesse de 20% sur la plate-forme où les performances comptent le plus.
la source