Worldedit
  Worldedit
Le site sur l'éditeur de warcraft 3 !
 
  FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs   medals.php?sid=e759a6f777f56904e5781d0c46057a8bMédailles   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 
  FAQFAQ World Editor   UploadUploader une map ou une image    UploadAjouter sa map à l'annuaire   UploadConsulter l'annuaire

Les secrets des Memory Leaks
Aller à la page Précédente  1, 2, 3, 4, 5, 6, 7, 8, 9, 10  Suivante
 
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Tutoriels
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...)
Rédacteur de tuto #1 (Quantité : 1) Ayane (Quantité : 1)

MessagePosté le: 21/06/16 08:52    Sujet du message: Citer

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
Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger
 Toc@rd
Membre actif


Inscrit le: 14 Avr 2009
Messages: 175
Sujets: 17
Spécialité en worldedit: Décors


MessagePosté le: 21/06/16 10:13    Sujet du message: Citer

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 :

Secret:

Gui:
Trigger:
Lancement Furie
Collapse Evénements
Unité - A unit Initie l'effet d'une compétence
Collapse Conditions
(Ability being cast) Egal à  Frénésie tribale
Collapse Actions
Custom script:   set udg_FurieGroupUnit = CreateGroup()
Set POSITIONOFUNIT[1] = (Position of (Casting unit))
Collapse Groupe unité - Pick every unit in (Units within 900.00 of (Position of TohKhaar) matching ((((Matching unit) is Un bâtiment) Egal à  FALSE) and ((((Matching unit) is Mécanique) Egal à  FALSE) and (((Owner of (Matching unit)) Egal à  Joueur 1 (Rouge)) and (((Matching unit) is alive) Egal à   and do (Actions)
Collapse Boucle - Actions
Groupe unité - Add (Picked unit) to FurieGroupUnit
Groupe unité - Remove TohKhaar from FurieGroupUnit
Set FurieNombreUnits = (Number of units in FurieGroupUnit)
Collapse For each (Integer A) from 1 to FurieNombreUnits, do (Actions)
Collapse Boucle - Actions
Set FurieCasters[5] = (Random unit from FurieGroupUnit)
Unité - Create 1 Dummy Furie des Jungles for Joueur 1 (Rouge) at (Position of TohKhaar) facing Orientation bâtiment par défaut degrees
Unité - Add a 2.00 second Générique expiration timer to (Last created unit)
Unité - Order (Last created unit) to Chaman orc - Furie sanguinaire FurieCasters[5]
Groupe unité - Remove FurieCasters[5] from FurieGroupUnit
Groupe unité - Remove all units from FurieGroupUnit
Set FurieCasters[5] = Pas d'unité
Custom script:   call RemoveLocation( udg_POSITIONOFUNIT[1] )
Custom script:   set udg_FurieGroupUnit = CreateGroup()
Custom script:   set udg_FurieGroupUnit = null



Merci beaucoup pour votre aide.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Ayane
Bot administrateur


Inscrit le: 17 Sep 2007
Messages: 2009
Sujets: 49

Médailles: 2 (En savoir plus...)
Ayane (Quantité : 1) Rédacteur de tuto #1 (Quantité : 1)

MessagePosté le: 21/06/16 10:47    Sujet du message: Citer

Gui:
Trigger:
Custom script:   set udg_FurieGroupUnit = CreateGroup()
Custom script:   set udg_FurieGroupUnit = null

Fuite de mémoire.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger
 Toc@rd
Membre actif


Inscrit le: 14 Avr 2009
Messages: 175
Sujets: 17
Spécialité en worldedit: Décors


MessagePosté le: 21/06/16 12:55    Sujet du message: Citer

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
Voir le profil de l'utilisateur Envoyer un message privé
 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...)
Rédacteur de tuto #3 (Quantité : 1) Grand mage créateur de sort (Quantité : 1)

MessagePosté le: 23/06/16 18:53    Sujet du message: Citer

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
Voir le profil de l'utilisateur Envoyer un message privé
 Wareditor
The Master of Nothing


Inscrit le: 22 Déc 2008
Messages: 1638
Sujets: 88
Spécialité en worldedit: Effacer


MessagePosté le: 23/06/16 19:39    Sujet du message: Citer

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
Voir le profil de l'utilisateur Envoyer un message privé
 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...)
Grand mage créateur de sort (Quantité : 1) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 23/06/16 21:20    Sujet du message: Citer

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
Voir le profil de l'utilisateur Envoyer un message privé
 Wareditor
The Master of Nothing


Inscrit le: 22 Déc 2008
Messages: 1638
Sujets: 88
Spécialité en worldedit: Effacer


MessagePosté le: 24/06/16 06:09    Sujet du message: Citer

Bien entendu.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 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...)
Créateur d'unité (Quantité : 1)

MessagePosté le: 24/06/16 11:06    Sujet du message: Citer

Troll-Brain a écrit:
Certes.

Mais est ce que l'utilisation d'une interface graphique incomplète serait aussi une mauvaise pratique ?


Wareditor a écrit:
Bien entendu.


Tant de cruauté gratuite envers le pauvre GUI, ça m'avait manqué Wink.

Plus sérieusement, c'est pas vraiment une mauvaise pratique de passer la variable globale en locale si je me souviens bien du sujet qu'Ayane avait posté.
Evidemment, ça reste un cas rare(encore plus lorsqu'on n'utilise pas/plus le GUI) qui n’entraîne pas trop de problème et qui peut (un peu)aider à faire la transition GUI -> vJASS. Après, quand à utiliser une interface limitée pour faire des trucs limités je trouve pas ça comme étant une "mauvaise pratique", juste un truc qui tombe sous le sens(après de la à dire que c'est mauvais...).

Le jour où il se rendra compte des limites du GUI il passera au vJASS de toutes façons, c'est qu'une question de temps(après je reconnait que le GUI est plus kawai(avec ses petites icones et tout),mais bon il fallait bien qu'il ait quelque chose pour lui).
_________________
Inactif(Enfn presque)
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Wareditor
The Master of Nothing


Inscrit le: 22 Déc 2008
Messages: 1638
Sujets: 88
Spécialité en worldedit: Effacer


MessagePosté le: 24/06/16 14:23    Sujet du message: Citer

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
Voir le profil de l'utilisateur Envoyer un message privé
 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...)
Créateur d'unité (Quantité : 1)

MessagePosté le: 25/06/16 13:32    Sujet du message: Citer

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
Voir le profil de l'utilisateur Envoyer un message privé
 Toc@rd
Membre actif


Inscrit le: 14 Avr 2009
Messages: 175
Sujets: 17
Spécialité en worldedit: Décors


MessagePosté le: 29/06/16 14:52    Sujet du message: Citer

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
Voir le profil de l'utilisateur Envoyer un message privé
 DarK™
Membre actif


Inscrit le: 29 Aoû 2011
Messages: 197
Sujets: 15
Spécialité en worldedit: Système/Déclencheurs [GUI]


MessagePosté le: 29/06/16 14:53    Sujet du message: Citer

De mon expérience, il me semble que cela fonctionne.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
 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...)
Rédacteur de tuto #3 (Quantité : 1) Grand mage créateur de sort (Quantité : 1)

MessagePosté le: 29/06/16 21:24    Sujet du message: Citer

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
Voir le profil de l'utilisateur Envoyer un message privé
 Wareditor
The Master of Nothing


Inscrit le: 22 Déc 2008
Messages: 1638
Sujets: 88
Spécialité en worldedit: Effacer


MessagePosté le: 30/06/16 15:50    Sujet du message: Citer

Troll-Brain a écrit:
J'en ai appris un récemment.
Si on utilise l'index 8191 (index maximum) d'une variable déployée.
Il devient impossible de charger une partie sauvegardée de cette map (warcraft plante au chargement)


2008 Rolling Eyes
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Tutoriels Toutes les heures sont au format GMT + 1 Heure
Aller à la page Précédente  1, 2, 3, 4, 5, 6, 7, 8, 9, 10  Suivante
Page 9 sur 10

 
Sauter vers:  
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


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com