• # Entity Component System

    Posté par (site web personnel) . En réponse à la dépêche Les graphes de scène. Évalué à 6.

    Une question qui me turlupine quand même, c'est comment intégrer efficacement un SceneGraph et un ECS.

    Le but des ECS c'est de stocker les données de manière contigüe en mémoire, afin de gagner en performance lors de l'accès aux données.

    On va donc avoir un tableau de "transform", un tableau de "shader", un tableau de "mesh", etc... (tableau dans le sens non-IT du terme, l'implémentation peut être un array, un sparse set, un vector, etc... ce n'est pas de ça que je parle ici quand je dis tableau)

    Et on va ensuite avec une fonction "render" qui va itérer sur ces tableaux. Et les caches du CPU seront bien content.

    Sauf que un SceneGraph, c'est un graphe acyclique. Donc des pointeurs vers des structures qui contiennent des pointeurs vers d'autres structures.

    Je vois alors 2 solutions :

    • le composant "transform" contient une référence vers le noeud du SceneGraph : mince on doit faire un aller/retour entre le CPU et la RAM, le gain de perf est nullifié
    • les noeuds du SceneGraph ont une référence vers l'entité, chaque frame on doit vérifier si l'entité existe encore et synchroniser le SceneGraph, puis mettre à jour le composant "transform" de l'entité : aucune idée du coût en performance de faire ça a chaque frame

    Y-a-t-il d'autres solutions ?

    https://link-society.com - https://kubirds.com - https://github.com/link-society/flowg