• [^] # Re: Collisions de procédures ?

    Posté par . En réponse au journal Découverte de l'Entity Component System avec Bevy. Évalué à 4.

    Ça fait plus de 10 ans que j'ai pas animé un sprite avec ce genre de moteur, mais dans mes souvenirs, dans un moteur ECS qui fait du parallélisme, l'information des dépendances sur les type de composants utilisés pour chacun des systèmes est documentée par le développeur. Si un système qui utilise les composantes d'utilisateurs, un autre système qui les utilise ne sera pas donc pas exécuté en même temps.

    D'autre part il me semble qu'on agit par phases et on fait le nettoyage après avoir effectué les mises à jour pour éviter les soucis.

    L'utilisation en dehors du jeu vidéo n'est pas impossible, mais son point fort est d'être optimisée pour des scénarios spécifiques où chaque entité possède de caractéristiques de plusieurs types et où les calculs peuvent être fait sur des groupes de caractéristiques communes à un grand nombre d'entités.

    Pour reprendre l'exemple d'envoi d'e-mail, on va considérer une entité (dans un moteur, elle peut être références par un entier, un uuid.., elle possède juste un identifiant unique).

    Cette entité possède les caractéristiques, les composantes "Utilisateur" et "EMailAEnvoyer" avec les informations associées.

    Si la procédure d'envoi d'e-mail nécessite un utilisateur des e-mails à envoyer, le système (la fonction) correspondant sera marqué pour s’exécuter sur les entités avec les composantes "Utilisateur" et "EMailAEnvoyer". Tu ne peux normalement pas retirer EMailAEnvoyer depuis un autre système, pour la raison énoncées plus haut: il ne devrait pas y avoir d'autre système en exécution avec cette composante. On peut imaginer qu'une fois les e-mails à envoyer envoyés, la composante EMailAEnvoyer soit retirée.

    Si d'autres système ont besoin d'y accéder, ils faut qu'ils aient été mis avant dans la liste des systèmes à exécuter, ou ajouter une autre composante pour labelliser l'entité comme étant à nettoyer du label EMailAEnvoyer en fin de boucle.

    Donc collisions, normalement ça ne devrait pas arriver, mais ça demande d'ajuster son moteur au préalable, sans doute plus qu'avec une autre architecture. Le découpage des données en composantes à aussi énormément d'impact sur comment va s'effectuer le parallélisme..

    ... et du coup je suis curieux de savoir s'il y a des moyens de "garantir que ça fonctionnera toujours"

    Bref, ça devrait être possible :-)

    Merci de prendre le commentaire ci-dessus avec: un peu de recul, le premier degré, et si possible le second !