Inscrit le: 25 Fév 2014 Messages: 1175 Sujets: 167 Spécialité en worldedit: La simplicité
Posté le: 12/09/23 11:20 Sujet du message: Les groupes d'unités, ça leak j'imagine
Bonjour,
Je viens vous poser deux simples questions.
1) Un groupe d'unité du genre "Pick every player in Team2", Team2 étant ... l'équipe 2 (en tout cas, ce n'est pas une variable), ça crée une donnée à chaque fois, donc ça doit leak non ? Pourtant, ce n'est pas évoqué dans le tuto sur les memory leaks.
2) Et si j'ai un déclencheur qui s'active quand une unité en tue une autre et qui accroît le niveau d'une compétence du tueur de 1 (Killing unit), ça fait du leak parce que killing unit est stocké ou pas ?[/spoiler]
Merci d'avance pour votre réponse. _________________
Inscrit le: 08 Sep 2013 Messages: 531 Sujets: 70 Spécialité en worldedit: GameDesign et optimisation JASS
Posté le: 14/09/23 11:06 Sujet du message:
1) Si tu fais un appel comme Allies of (Player X) ou Convert player to player group oui. Si c'est une variable définie comme par exemple ici non puisque tu crées qu'une seule fois le groupe de joueur !
Secret:
Gui:
Trigger:
Events Time - Elapsed game time is 0.00 seconds Conditions
Actions
Set VariableSet Humans = (All allies of Player 1 (Red).) Set VariableSet Creeps = (All allies of Player 19 (Mint).) Player Group - Pick every player in Creeps and do (Actions) Loop - Actions Player - Set (Picked player).Current gold to 0 Player - Set (Picked player).Current lumber to 0 Player - Set (Picked player).Food cap to 2 Player - Set (Picked player).Food max to 2 Player - Turn Gives bounty On for (Picked player) AI - Ignore the guard positions of all (Picked player) units Player - Change color of (Picked player) to Black, Changing color of existing units
2) Non, c'est juste un accès à l'unité. Les réponses d'évènement ne fuient pas à ma connaissance. _________________
"L'homme qui meurt est un astre couchant, qui se lève plus radieux sur un autre hémisphère"
"On entends le fracas des Arbres qui tombent, mais pas le murmure de ceux qui poussent"
Plus précisément le problème ne vient pas des variables ou des données, une variable de type unité ou joueur ne pose pas de problème car c'est une référence vers les données internes du jeu. Le problème c'est lorsque l'on demande l'allocation répétée d'un espace mémoire et qu'on ne le libère pas après utilisation.
Simple exemple visuel d'une situation posant problème :
Toutes les 0,1 secondes
Créer 1 Fantassin
Si ces unités ne sont pas détruites à un moment alors cela va dépasser la capacité du système.
Lorsque l'on appel une fonction telle que "(All allies of Player 1 (Red).)" alors ce créé une collection en mémoire vive qui contiendra la liste des joueurs. Si on rappel de nouveau cette fonction alors cela créera une nouvelle collection de joueurs (qui en soi peut avoir des valeurs différentes de la précédente collection si les alliances ont changées).
Le moteur de script de Warcraft 3 n'est pas capable de détecter que vous n'allez plus utiliser la collection précédemment créée, ainsi si vous en créez sans arrêt sans les supprimer alors comme pour l'exemple de création de fantassin le système va rapidement devenir submergé par toutes ces collections.
Dans l'exemple de Ghost_of_past il y a deux collections qui sont crées et qui sont perdues à la fin d'exécution, c'est donc une fuite de mémoire, mais dans cet exemple cela ne va se produire qu'une fois, donc ce n'est qu'une goutte d'eau par rapport aux capacités des ordinateurs. Le tout est de faire attention de ne pas répéter ces gouttes d'eau pour éviter de former un océan.
Pick every player in ne va pas créer de fuite de mémoire car il va seulement itérer sur la collection, c'est seulement une opération de lecture des données de la collection.
killing unit est simplement une fonction qui fournit une référence vers une unité, il n'y a donc pas de fuite de mémoire.
Pour Team2 si je me souviens bien c'est une constante initialisée au début dans map.j, la force est donc enregistrée dans une variable que tu peux réutiliser tout au long de la partie, cela ne va donc pas appeler la fonction à chaque fois pour créer une nouvelle force. _________________
Vous ne pouvez pas poster de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas voter dans les sondages de ce forum