C'est pas mal pour l'update: les systèmes n'ont à s'occuper que des attributs local*
Par contre lors du rendu graphique, c'est plus compliqué. Lorsque le système de rendu graphique fait l'itération des composants Transformation, à chaque fois qu'il y a un parent, il devra passer par le parent. Donc les parents sont visités au moins autant de fois qu'ils ont d'enfants (et de sous enfants). En POO et OpenGL on commence toujours par les parents et on descend la hiérarchie en multipliant les matrices de position à chaque étape. Au final chaque objet n'est visité qu'une fois.
C'est vrai qu'en ES l'itération peut être optimisée car on peut mettre tous les composants dans un seul tableau à la suite, et donc le CPU peut optimiser les accès mémoire. Mais là on doit visiter tous les composants parents plusieurs fois, et je me demande s'il ne serait pas possible de faire mieux. Par exemple en définissant des composants TransformationEnfant et des composants TransformationParent, ou d'autres idées du même style. Car il ne faut pas oublier que les composants ne sont pas ordonnés, et donc l'itération avec un type de composant se fait dans le "désordre".
Revenons à ton exemple. Il suffirait de rajouter un boolean qui indique si les coordonnées world* ont déjà été recalculées à partir du parent, afin de limiter un peu le nombre de visites. A partir d'un enfant on ne remonterai alors plus que d'un niveau dans la hiérarchie, sauf si le parent n'a pas encore été recalculé. (Bon en fait au lieu d'un boolean j'utiliserai un int qui contiendrai un numéro incrémenté à chaque game loop, mais c'est pour l'idée). Pour l'instant, c'est un système de ce style que j'utiliserai.
[^] # Re: Moteur de rendu
Posté par jlgrall . En réponse au journal entity.JS - un "Entity System" en JavaScript. Évalué à 1.
C'est pas mal pour l'update: les systèmes n'ont à s'occuper que des attributs local*
Par contre lors du rendu graphique, c'est plus compliqué. Lorsque le système de rendu graphique fait l'itération des composants Transformation, à chaque fois qu'il y a un parent, il devra passer par le parent. Donc les parents sont visités au moins autant de fois qu'ils ont d'enfants (et de sous enfants). En POO et OpenGL on commence toujours par les parents et on descend la hiérarchie en multipliant les matrices de position à chaque étape. Au final chaque objet n'est visité qu'une fois.
C'est vrai qu'en ES l'itération peut être optimisée car on peut mettre tous les composants dans un seul tableau à la suite, et donc le CPU peut optimiser les accès mémoire. Mais là on doit visiter tous les composants parents plusieurs fois, et je me demande s'il ne serait pas possible de faire mieux. Par exemple en définissant des composants TransformationEnfant et des composants TransformationParent, ou d'autres idées du même style. Car il ne faut pas oublier que les composants ne sont pas ordonnés, et donc l'itération avec un type de composant se fait dans le "désordre".
Revenons à ton exemple. Il suffirait de rajouter un boolean qui indique si les coordonnées world* ont déjà été recalculées à partir du parent, afin de limiter un peu le nombre de visites. A partir d'un enfant on ne remonterai alors plus que d'un niveau dans la hiérarchie, sauf si le parent n'a pas encore été recalculé. (Bon en fait au lieu d'un boolean j'utiliserai un int qui contiendrai un numéro incrémenté à chaque game loop, mais c'est pour l'idée). Pour l'instant, c'est un système de ce style que j'utiliserai.