Envoyé par
Emmanuel Deloget
Quelques pièges à éviter :
1) "je veux supporter OpenGL et DirectX" : non, tu ne veux pas. Vouloir s'auto-doubler sa charge de travail, ça s'appelle du masochisme. Sans compter que tu n'utiliseras jamais les deux en même temps. Et puisque les deux font la même chose... (note: OpenGL te donne accès au GS sous XP, contrairement à DirectX 10 qui ne fonctionne que sous Vista). (note n°2: mes respects à Laurent. Oui, je sais, le yes::engine supporte DirectX et OpenGL).
2) "le fixed function pipeline, c'est cool" : oui, et il est bien plus compliqué d'abstraire deux fonctionnements très différents qu'un seul. Alors autant l'abandonner tout de suite - quitte à le réimplémenter en utilisant des shaders simples.
3) "et comme ça, je peux attaquer directement OpenGL..." (ou DirectX (mais pas les deux, hein ?)) : tu veux faire un moteur pour t'abstraire de ces problèmes, alors autant t'abstraire de l'API. Mais s'isoler de l'API n'est pas forcément quelque chose de très simple : on a tendance à répliquer son architecture. Et bien, ça n'a pas de sens.
Si on prend l'architecture DirectX 9, l'objet central est le Direct3DDevice9. Une instance de cet objet permet de créer des ressources, envoyer des ordres à la carte graphique, etc. Ce qui est très bien puisque l'interface représente la carte video - c'est très bas niveau. Il ne sert à rien d'encapsuler ces appels dans une classe C++ engine:irect3DDevice qui offre les même services (autant utiliser directement DirectX, on s'économise pas mal de travail). La plupart du temps, on souhaite créer un renderer - et c'est là que le bât blesse : un renderer n'a pas pour mission de créer une ressource (c'est une factory de ressource qui doit s'en charger) ou de maintenir l'état des ressources (une collection de ressource s'en chargera très bien).
Mais trop d'abstraction tue l'abstraction : on obtient assez aisément une architecture rigide et difficile à maintenir si on y fait pas attention.
4) "et là , mon renderer, j'en fait un singleton..." : et là, mon coeur, j'en fait du hachis parmentier. Non, votre renderer n'est pas un singleton. Ca ne sert à rien (non, vous n'allez pas créer deux instances. Pourquoi diable feriez vous ça, mon cher ?) et fera plus que vous ennuyer par la suite (et si je décidait de binder un renderer à une surface de rendu + un viewport dès la création et jusqu'à sa destruction, pour me simplifier la vie ?). De toute manière, je déconseille formellement à quiconque d'utiliser le pattern singleton, au moins tant qu'on a pas compris à quoi il sert vraiment (et pourquoi il est plus génant qu'efficace). Mais c'est un point de détail. (note n°3: mes respects à Laurent. Oui, je sais, le yes::engine utilise des singletons).
5) "je refais les fonctions de gestion de vecteurs / plans / matrices... ": oui, pourquoi pas ? Les gens qui les ont écrit sont incompétents de toute façon. Il écrivent exprès du code lent et buggé, de manière à vous forcer à réécrire ces parties hautement passionnantes. Après ça, mettez vous à memset() et memcpy(). C'est très intéressant aussi. Et pourquoi ne pas développez vos propres conteneurs en C++ ? Voire un compilateur, au point ou on en est...
Rien d'autre ne me vient à l'esprit pour l'instant.
Ah si, un mot, pendant que j'y pense: faisabilité.
C'est un peu mieux que réalisabilité, et en plus, ça existe...
Partager