Voir le sujet précédent :: Voir le sujet suivant |
Auteur |
Message |
Ayane Bot administrateur
Inscrit le: 17 Sep 2007 Messages: 2009 Sujets: 49
Médailles: 2 (En savoir plus...)
|
Posté le: 21/06/16 08:52 Sujet du message: |
|
|
Si tu réutilise le groupe à chaque itération alors il n'y a pas de fuite de mémoire... et tu n'as pas besoin de t'embêter à créer et supprimer un groupe à chaque fois.
Une fuite de mémoire c'est lorsque tu créer un objet puis tu perd la référence, ce qui te laisse un espace mémoire réservé non utilisé; exemple:
Gui: | Trigger: Custom script: CreateGroup() |
qui va te créer un groupe mais vu que tu ne l'affecte à aucune variable tu perd donc sa référence et il prend donc de l'espace mémoire inutilement.
En réalité le moteur de script garde une référence de l'objet et libère l'espace lorsque l'on quitte la carte. Ce n'est pas important si quelques octets sont réservés inutilement jusqu'à la fin vu que l'on n'est pas sur un système embarqué avec 2Ko d'espace mémoire.
Sur Warcraft3 l'éditeur a été conçut pour faire ces fuites de mémoire, les ingénieurs les ont jugés négligeables dans la plupart des cas car cela ne pose problème que lorsque cela remplis la capacité de la mémoire vive de l'utilisateur, auquel cas le système va effectuer des sauvegarde de bloc de la mémoire vive sur disque dur (swap) et les recharger ce qui prends du temps et va finir par causer des soucis de performance sévère. Pour arriver à ce point ce n'est pas sur l'exécution de quelques déclencheurs mais sur il te faudra des milliers de milliers d'itérations de ton déclencheur.
Par exemple imaginons que tu as un déclencheur qui fuit un Point (Location) à chaque itération, si on estime que cela occupe 24 octets par Point pour que cela occupe 1Go de mémoire vive il faudra donc plus de 45 milliards d'itération du déclencheur.
Autrement dit les seuls déclencheurs qui posent problèmes sont des déclencheurs périodiques à faible période qui contiennent des boucles s'itérant plusieurs milliers de fois et à chaque itération cause des fuites de mémoire.
A une époque les utilisateurs avaient tendance à avoir du mal avec l'évènementiel et leurs solutions consistaient généralement à utiliser systématiquement des déclencheurs périodiques qui testaient si leur condition était vrai... Cela leur causait évidemment des soucis de performances et vu qu'ils créaient des fuites de mémoire à chaque teste, ils se retrouvaient alors avec des performances qui se dégradaient au bout d'une vingtaine de minute (en fonction de l'espace mémoire disponible).
Actuellement les utilisateurs sont un peu plus intelligent, ils utilisent l'évènement lorsqu'une unité meurt avec les conditions appropriées pour donner la victoire lorsque le boss est tué au lieu de faire: toutes les 0.1 secondes, si le boss n'est pas vivant et que ... _________________
|
|
Revenir en haut |
|
|
Toc@rd Membre actif
Inscrit le: 14 Avr 2009 Messages: 175 Sujets: 17 Spécialité en worldedit: Décors
|
Posté le: 21/06/16 10:13 Sujet du message: |
|
|
D'accord, merci pour ces éclaircissements. Je vais quand même traiter les quelques leaks que je vois sur ma carte, par perfectionnisme, et être plus attentif sur les périodiques – que je n'utilise de toutes façons que peu.
Quoi qu'il en soit, avec la solution de Wareditor plus rien ne bloque, ni mon déclencheur ni sa répétition :
Merci beaucoup pour votre aide. _________________
|
|
Revenir en haut |
|
|
Ayane Bot administrateur
Inscrit le: 17 Sep 2007 Messages: 2009 Sujets: 49
Médailles: 2 (En savoir plus...)
|
Posté le: 21/06/16 10:47 Sujet du message: |
|
|
Gui: | Trigger: Custom script: set udg_FurieGroupUnit = CreateGroup() Custom script: set udg_FurieGroupUnit = null |
Fuite de mémoire. _________________
|
|
Revenir en haut |
|
|
Toc@rd Membre actif
Inscrit le: 14 Avr 2009 Messages: 175 Sujets: 17 Spécialité en worldedit: Décors
|
Posté le: 21/06/16 12:55 Sujet du message: |
|
|
Effectivement c'est une erreur de c/c de ma part, le deuxième create devait être la suppression. Quoi qu'il en soit le déclencheur fonctionne toujours après correction. _________________
|
|
Revenir en haut |
|
|
Troll-Brain Ri1kamoua
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
|
Posté le: 23/06/16 18:53 Sujet du message: |
|
|
Wareditor a écrit: | Le deuxième exemple est tout simplement faux. Le premier est faux car tu essaie de créer une variable locale (concept qui n'est pas apparent en GUI mais qui est fondamental en Jass) ayant le même nom qu'une variable globale.
La solution correcte est :
Jass: | set udg_FurieGroupUnit = CreateGroup() |
Si tu veux utiliser une variable locale (qui ne servira que pour ce déclencheur). Il faut placer en haut de ton déclencheur.
Jass: | local group nomdugroup = CreateGroup() |
Ensuite tu référence le groupe tout au long du déclencheur par nomdugroup. N'oublie pas de détruire et de nuller le groupe à la fin de ton déclencheur. |
Euh si j'ai bonne mémoire avoir une variable locale et une variable globale du même nom a toujours été légal, le comportement par contre a varié au cours des patchs.
Mais je crois que maintenant une variable locale a la priorité par rapport à une variable globale (à tester et confirmer avec l'éditeur officiel).
On peut donc utiliser cette astuce en GUI.
Sous réserve que cette variable reste dans la portée de la fonction où elle a été déclarée.
Je pense notamment aux If/then en GUI qui créent des fonctions à part pour les conditions. _________________
Le violet, c'est moche. |
|
Revenir en haut |
|
|
Wareditor The Master of Nothing
Inscrit le: 22 Déc 2008 Messages: 1638 Sujets: 88 Spécialité en worldedit: Effacer
|
Posté le: 23/06/16 19:39 Sujet du message: |
|
|
Je viens de tester et effectivement la variable locale est prioritaire.
En tout cas, c'est une mauvais pratique que d'avoir des globales et des locales du même nom. _________________
|
|
Revenir en haut |
|
|
Troll-Brain Ri1kamoua
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
|
Posté le: 23/06/16 21:20 Sujet du message: |
|
|
Certes.
Mais est ce que l'utilisation d'une interface graphique incomplète serait aussi une mauvaise pratique ? _________________
Le violet, c'est moche. |
|
Revenir en haut |
|
|
Wareditor The Master of Nothing
Inscrit le: 22 Déc 2008 Messages: 1638 Sujets: 88 Spécialité en worldedit: Effacer
|
Posté le: 24/06/16 06:09 Sujet du message: |
|
|
Bien entendu. _________________
|
|
Revenir en haut |
|
|
Ectelion Membre reconnu
Inscrit le: 12 Nov 2011 Messages: 1062 Sujets: 107 Spécialité en worldedit: Inactif(Enfin presque) Médailles: 1 (En savoir plus...)
|
|
Revenir en haut |
|
|
Wareditor The Master of Nothing
Inscrit le: 22 Déc 2008 Messages: 1638 Sujets: 88 Spécialité en worldedit: Effacer
|
Posté le: 24/06/16 14:23 Sujet du message: |
|
|
J'ai moi même passé pas mal d'années à mapper en GUI. Il n'y a pas de honte, c'est tout à fait normal. Mais le GUI est objectivement une version limitée et moins efficace du Jass.
C'est l'aspect interface graphique et la facilité de prise en main qui font que cette "mauvaise pratique" subsiste et est toléré malgré ses désavantages. _________________
|
|
Revenir en haut |
|
|
Ectelion Membre reconnu
Inscrit le: 12 Nov 2011 Messages: 1062 Sujets: 107 Spécialité en worldedit: Inactif(Enfin presque) Médailles: 1 (En savoir plus...)
|
Posté le: 25/06/16 13:32 Sujet du message: |
|
|
Wareditor a écrit: | Le GUI est objectivement une version limitée et moins efficace du Jass. |
On est bien d'accord.
Wareditor a écrit: | C'est l'aspect interface graphique et la facilité de prise en main qui font que cette "mauvaise pratique" subsiste et est toléré malgré ses désavantages |
Tout le monde n'a pas forcément envie de coder "en dur" :/.
J'espère juste qu'un prochain patch mettra le GUI a niveau, notamment au niveau des memory leaks et réduira la quantité de trucs "hard codé" dans le jeu(même si là je rêve un peu). _________________
Inactif(Enfn presque) |
|
Revenir en haut |
|
|
Toc@rd Membre actif
Inscrit le: 14 Avr 2009 Messages: 175 Sujets: 17 Spécialité en worldedit: Décors
|
Posté le: 29/06/16 14:52 Sujet du message: |
|
|
Salut c'est encore moi, je suis en train de simplifier les variables de mes sorts en utilisant le déploiement plutôt que plusieurs variables.
Du coup je voudrais juste savoir si les Custom scripts que vous m'aviez indiqués pour les leaks sont toujours bons ainsi modifiés pour les variables déploiement :
Gui: | Trigger: Custom script: set udg_UltimeGroupUnit[1] = CreateGroup() Custom script: set udg_UltimeGroupUnit[2] = CreateGroup() |
Gui: | Trigger: Custom script: call DestroyGroup( udg_UltimeGroupUnit[1] ) Custom script: set udg_UltimeGroupUnit[1] = null Custom script: call DestroyGroup( udg_UltimeGroupUnit[2] ) Custom script: set udg_UltimeGroupUnit[2] = null |
J'ai simplement ajouté [n] correspondant au numéro de déploiement à la fin du nom du groupe dans le script.
Merci encore. _________________
|
|
Revenir en haut |
|
|
DarK™ Membre actif
Inscrit le: 29 Aoû 2011 Messages: 197 Sujets: 15 Spécialité en worldedit: Système/Déclencheurs [GUI]
|
Posté le: 29/06/16 14:53 Sujet du message: |
|
|
De mon expérience, il me semble que cela fonctionne. _________________
|
|
Revenir en haut |
|
|
Troll-Brain Ri1kamoua
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
|
Posté le: 29/06/16 21:24 Sujet du message: |
|
|
Fun fact :
Utiliser l'index 8191 d'une variable empêchera une partie enregistrée d'être lancée.
Au revoir. _________________
Le violet, c'est moche. |
|
Revenir en haut |
|
|
Wareditor The Master of Nothing
Inscrit le: 22 Déc 2008 Messages: 1638 Sujets: 88 Spécialité en worldedit: Effacer
|
|
Revenir en haut |
|
|
|