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=69d16d168244fd7da794edecbcdb689eMé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

LEAK : fonctions -> nullifier paramètres
Aller à la page 1, 2  Suivante
 
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Aide sur les déclencheurs
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
 Max
Floodeur prématuré


Inscrit le: 13 Jan 2009
Messages: 550
Sujets: 47
Spécialité en worldedit: La partie déclencheurs sauf le GUI.


MessagePosté le: 18/07/09 22:34    Sujet du message: LEAK : fonctions -> nullifier paramètres Citer

Prenons un exemple de fonction :
Jass:
function IsMonster takes unit U returns boolean
    return GetPlayerId( GetOwningPlayer(U) ) > 11
endfunction


Ne devrait-on pas dans l'exemple présent nullifier U ? (réponse : non, inutile)
comme cela :
Jass:
function IsMonster takes unit U returns boolean
    local boolean b = GetPlayerId( GetOwningPlayer(U) ) > 11
    set U = null
    return b
endfunction

_________________
Maximaxou@northrend

Projet Max Escape Creation (éditeur d'escapes : mazes/slides) : http://max.slid.free.fr/maxEscapeCreation/


Dernière édition par Max le 21/07/09 20:49; édité 1 fois
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Eme
Floodeur prématuré


Inscrit le: 02 Nov 2008
Messages: 541
Sujets: 23



MessagePosté le: 18/07/09 23:42    Sujet du message: Citer

Tu as dis toi-même qu'il était inutile de nullifier les variables de types unités.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 jk2pach
Invité








MessagePosté le: 18/07/09 23:44    Sujet du message: Citer

Eme a écrit:
Tu as dis toi-même qu'il était inutile de nullifier les variables de types unités.


J'ai toujours entendu le contraire :O
_________________
Revenir en haut
 Eme
Floodeur prématuré


Inscrit le: 02 Nov 2008
Messages: 541
Sujets: 23



MessagePosté le: 18/07/09 23:49    Sujet du message: Citer

Personnellement, je pense qu'il le faut, car pour moi cela crée un nouveau pointeur qu'il faut donc nullifier. Après peut-être que ça se passe d'une autre façon car apparement c'est ce qui est resorti de la plupart des sujets là-dessus.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 profet
Instanton Gravitationnel Singulier


Inscrit le: 21 Aoû 2007
Messages: 1633
Sujets: 53
Spécialité en worldedit: Pain d'épice multitâche (terrain, scripts, textures, modèles...)
Médailles: 2 (En savoir plus...)
Rédacteur de tuto #3 (Quantité : 1) Profet (Quantité : 1)

MessagePosté le: 19/07/09 01:44    Sujet du message: Re: LEAK : fonctions -> nullifier paramètres Citer

Citation:
Personnellement, je pense qu'il le faut, car pour moi cela crée un nouveau pointeur qu'il faut donc nullifier. Après peut-être que ça se passe d'une autre façon car apparement c'est ce qui est resorti de la plupart des sujets là-dessus.

Max a écrit:
Prenons un exemple de fonction :
Jass:
function IsMonster takes unit U returns boolean
    return GetPlayerId( GetOwningPlayer(U) ) > 11
endfunction


Ne devrait-on pas dans l'exemple présent nullifier U ?


Il faut distinguer deux choses, le leak d'objets et le leak de variables.
Ce qui nous amène aux trois raisons suivantes, qui spécifient qu'il n'est pas nécessaire de nullifier U.

1. Aucun objet n'est créé dans cette fonction, donc il n'y a pas de leak d'objets, donc pas de suppression d'objet à faire (call Destroy/Remove...)

2. Aucun objet n'a été supprimé, donc aucune variable locale ne pointe vers un objet supprimé, donc il n'y a aucune raison de nullifier qui que ce soit.

3. Les variables locales déclarées en tant qu'arguments de fonction n'ont pas besoin d'être nullifiées car elles sont toujours détruites.

Je vous invite également à (re)lire ceci Wink
_________________

Bêta Systems: 70%
Bêta Spells: 13%
Bêta Arts & graphics: 70%
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur
 Eme
Floodeur prématuré


Inscrit le: 02 Nov 2008
Messages: 541
Sujets: 23



MessagePosté le: 19/07/09 09:36    Sujet du message: Re: LEAK : fonctions -> nullifier paramètres Citer

profet a écrit:

3. Les variables locales déclarées en tant qu'arguments de fonction n'ont pas besoin d'être nullifiées car elles sont toujours détruites.

Donc, dans l'exemple ci-dessus, pas besoin de nullifier/détruire le groupe ? (cette fonction ne sert à rien, je suis d'accord, c'est juste un exemple)
Jass:

function GetFirstUnit takes group whichGroup returns unit
     return FirstOfGroup(whichGroup)
endfunction


Citation:
2. Aucun objet n'a été supprimé, donc aucune variable locale ne pointe vers un objet supprimé, donc il n'y a aucune raison de nullifier qui que ce soit.

Mais la variable unité est un pointeur inutilisé qui ne sera pas détruit quand l'unité sera supprimée. J'avoue que ce point la n'est pas clair. Quelqu'un pourrait me l'expliquer ou me donner un tuto (en anglais ou en français Very Happy)
Merci
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 profet
Instanton Gravitationnel Singulier


Inscrit le: 21 Aoû 2007
Messages: 1633
Sujets: 53
Spécialité en worldedit: Pain d'épice multitâche (terrain, scripts, textures, modèles...)
Médailles: 2 (En savoir plus...)
Rédacteur de tuto #3 (Quantité : 1) Profet (Quantité : 1)

MessagePosté le: 19/07/09 10:07    Sujet du message: Re: LEAK : fonctions -> nullifier paramètres Citer

profet a écrit:
3. Les variables locales déclarées en tant qu'arguments de fonction n'ont pas besoin d'être nullifiées car elles sont toujours détruites

_________________

Bêta Systems: 70%
Bêta Spells: 13%
Bêta Arts & graphics: 70%
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur
 Eme
Floodeur prématuré


Inscrit le: 02 Nov 2008
Messages: 541
Sujets: 23



MessagePosté le: 19/07/09 10:11    Sujet du message: Citer

Ok c'était ce que je me demandais dans la première partie de mon message mais sinon je parlais plus d'arguments de fonctions.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Max
Floodeur prématuré


Inscrit le: 13 Jan 2009
Messages: 550
Sujets: 47
Spécialité en worldedit: La partie déclencheurs sauf le GUI.


MessagePosté le: 19/07/09 11:59    Sujet du message: Citer

Eme a écrit:
Tu as dis toi-même qu'il était inutile de nullifier les variables de types unités.

Huh?

profet a écrit:
2. Aucun objet n'a été supprimé, donc aucune variable locale ne pointe vers un objet supprimé, donc il n'y a aucune raison de nullifier qui que ce soit.

Ce que tu disais ici contredit cela :
profet a écrit:
Une handle (=identifiant d'une entité/objet de war3) ne peut être recyclée que si l'objet stocké (en mémoire) est détruit, et si aucun pointeurs ne pointent encore dessus. Quand vous laissez un pointeur rester en mémoire, il ne fait pas qu'utiliser ces quelques octets, il empêche aussi la handle d'être recyclée, ce qui est plus problématique.

D'après ta deuxième citation, le moment où l'on va supprimer l'unité n'a aucune importance (ça peut être deux heures après l'appel de la fonction), c'est lors de la suppression de cette unité que le handle U empêcherait tous les pointeurs vers cette unité de se détruire. Cependant le 3 suffit (même si je ne comprends pas la différence avec une variable locale).

Par contre je ne comprends pas : "Une handle (=identifiant d'une entité/objet de war3) ne peut être recyclée que si l'objet stocké (en mémoire) est détruit, et si aucun pointeurs ne pointent encore dessus."
Si on met le handle à null, "l'objet stocké" c'est quoi alors, puisque que le pointeur n'est alors plus censé pointer vers quoi que ce soit ? C'est... le dernier objet pointé avant la nullification ?
_________________
Maximaxou@northrend

Projet Max Escape Creation (éditeur d'escapes : mazes/slides) : http://max.slid.free.fr/maxEscapeCreation/
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 profet
Instanton Gravitationnel Singulier


Inscrit le: 21 Aoû 2007
Messages: 1633
Sujets: 53
Spécialité en worldedit: Pain d'épice multitâche (terrain, scripts, textures, modèles...)
Médailles: 2 (En savoir plus...)
Rédacteur de tuto #3 (Quantité : 1) Profet (Quantité : 1)

MessagePosté le: 19/07/09 15:41    Sujet du message: Citer

Je pense qu'il y a une petite confusion entre handle et pointeur et tout ça... c'est pas évident.

Entrons un peu dans les détails:

1. Objets
J'imagine que tu as une notion de ce qu'est un "objet" dans le sens programmation du terme.
Tous les élements de warcraft3 en sont, qu'il s'agissent d'unité ou de doodads, mais aussi les textes affichés à l'écran, les sons....
Ces "objets" sont une quantité de mémoire variable allouée pour stocker les infos relatives à ce que j'appellerais des "entités" de Warcraft3.


2. Handles
Les handles ne sont pas vraiment des pointeurs comme on en rencontre en C par exemple, car ce ne sont pas des adresses mémoire à proprement parler.
Warcraft3 stocke ses "objets" dans une table, et donne à chacun un identifiant qui permet par la suite de récupérer "l'adresse mémoire" de l'objet. Il me semble d'ailleurs que dans warcraft, cela passe par deux tables consécutives..détail...
Cet identifiant est ce que l'on appelle "handle" que l'on pourrait traduire en français par "manipulateur" (to handle = manipuler).

Cette "handle" est une valeur entière, que l'on a fréquemment récupérée grâce à la fameuse fonction H2I.
Lorsqu'un objet est détruit correctement, son identifiant est "libéré" et pourra être réassigné à un nouvel objet par la suite.


3. Leaks d'objets
Certaines fonctions créent des "objets" (cf. 1), à qui sont associées des identifiants (handles, cf. 2) sans que l'utilisateur novice ne s'en doute, comme par exemple:
Jass:
constant native GetUnitLoc takes unit whichUnit returns location
//équivalent à:
function GetUnitLoc2 takes unit wichUnit returns location
    return Location( GetUnitX(wichUnit), GetUnitY(wichUnit) )
endfunction

Si cet utilisateur utilise GetUnitLoc (dans un sort par exemple), sans prendre la précaution de supprimer la location créée, des locations seront alors créées à chaque lancement du sort, et ne seront plus jamais réutilisées, occupant petit a petit de la mémoire inutilement. C'est ce qu'on appelle "leak d'objet".


4. Leaks de handles
Je me suis mal exprimé tout à l'heure en utilisant à tord le terme de "leak de variables", je voulais en fait signifier le fait, que ce leak est dû à l'utilisation des variables (en ne les nullifiant pas), mais il s'agit en fait d'un leak de handle.
Dans notre cas précédent, le leak d'objet entraine également l'utilisation définitive (jusqu'à la fin de la partie) de l'identifiant qui lui est alloué, qui ne pourra pas être réutilisé, il y a alors "leak de handle".

Dans le cas du "leak à cause des variables", il se produit également quelque chose d'étrange, à savoir que lorsque l'on détruit un objet et si une variable pointe encore sur cet objet, il est correctement détruit (donc pas de leak d'objet) mais sa handle n'est pas libérée (=> leak de handle), d'où la nécessité de la "nullifier".

Note: il me semble que le problème est le même pour les variable locales ou globales, à la différence prêt que la variable globale n'est jamais détruite (contrairement aux locales qui le sont en fin de fonction), donc il sera toujours possible de changer sa valeur par la suite et ainsi de libérer la handle fantôme.

Note2: il n'est pas forcément nécessaire de "nullifier" la variable, il suffit juste qu'elle ne pointe plus vers cet objet, c'est à dire vers un autre, ou vers "rien" (null).

Note3: étrangement, les arguments des fonctions (assimilés à des variables locales), ne "reference count" pas les handle, et n'empêchent donc pas la handle d'être libérée si l'objet est détruit. Ils n'ont donc pas besoin d'être nullifiés.


5. Le problème des Leaks
Il y a deux problèmes bien distincts:

- Le leak d'objets ne concerne que la configuration matérielle, car cela consomme de la RAM. Problème maintenant quasi insignifiant compte tenu de la quantité de mémoire vive disponible sur les ordinateurs actuels et les quantités infinitésimales perdues (il faudrait des parties de plusieurs heures avec des leak très fréquents pour consommer les gigas de RAM disponibles..)

- Le leak de handle, bien plus problématique... car Warcraft3 perd un peu pied lorsque l'on atteint un grand nombre de handles (je suis déjà passé lors de tests, à moins de 1fps au bout de 20 minutes de jeu.. avec des messages chat qui s'affichaient presque une minute plus tard à l'écran...etc..)



Pour en revenir à ta question, si l'on étudie ta fonction:
Jass:
function IsMonster takes unit U returns boolean
    return GetPlayerId( GetOwningPlayer(U) ) > 11
endfunction

On peut remarquer qu'aucune des 2 fonctions (GetPlayerId et GetOwningPlayer) ne créé d'objets (la première retourne un entier, la deuxième retourne un "joueur" mais ne le créé pas) donc pas de leak d'objet.
Il n'y a pas non plus de fonction qui détruise un objet donc pas de risque de leak de handle non plus.

Alors OUI, ton objet (unité) occupera toujours de la place en mémoire, et utilisera un indentifiant, mais cela est totalement normal vu que l'unité est toujours présente sur la carte Wink



Voilà! J'espère avoir été assez clair^^
_________________

Bêta Systems: 70%
Bêta Spells: 13%
Bêta Arts & graphics: 70%
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur
 Max
Floodeur prématuré


Inscrit le: 13 Jan 2009
Messages: 550
Sujets: 47
Spécialité en worldedit: La partie déclencheurs sauf le GUI.


MessagePosté le: 20/07/09 17:28    Sujet du message: Citer

Hm pas mal pas mal ! Very Happy



Donc si j'ai bien compris, si j'ai 15 variables de type unité pointant vers la même unité, puis que je détruis cette unité, il y aura un leak de un seul handle, celui de l'unité ? Et s'il y a leak d'objet, il y a forcément également leak de handle (celui de cet objet) ?
Pour résumer, variable de type objet = pointeur vers handle ?

Par contre une chose que je ne comprends pas : si les variables locales sont vraiment détruites en fin de fonction, elles ne devraient plus consister en un pointeur vers handle (vu qu'elles n'existent plus ?), alors pourquoi les nullifier ?


profet a écrit:
Il y a deux problèmes bien distincts:

- Le leak d'objets ne concerne que la configuration matérielle, car cela consomme de la RAM. Problème maintenant quasi insignifiant compte tenu de la quantité de mémoire vive disponible sur les ordinateurs actuels et les quantités infinitésimales perdues (il faudrait des parties de plusieurs heures avec des leak très fréquents pour consommer les gigas de RAM disponibles..)

- Le leak de handle, bien plus problématique... car Warcraft3 perd un peu pied lorsque l'on atteint un grand nombre de handles (je suis déjà passé lors de tests, à moins de 1fps au bout de 20 minutes de jeu.. avec des messages chat qui s'affichaient presque une minute plus tard à l'écran...etc..)

Je me demandais comment cela se faisait que je ramais (beaucoup de spikes) arrivé à un leak de 1 go (voire moins) alors que j'ai 3 go de mémoire vive... donc ça ne vient pas de ma ram, mais de war3 lui-même qui a un problème pour gérer tous ces handles...

Sinon je me demande, l'écran noir en fin de partie (qui peut durer de nombreuses minutes suivant la quantité de leak et les performances de l'ordinateur), dû au leak d'objets, est-ce à cause du temps que met l'ordinateur à libérer la mémoire utilisée par le leak d'objets ou celui des handles (ou les deux) ?
_________________
Maximaxou@northrend

Projet Max Escape Creation (éditeur d'escapes : mazes/slides) : http://max.slid.free.fr/maxEscapeCreation/
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Max
Floodeur prématuré


Inscrit le: 13 Jan 2009
Messages: 550
Sujets: 47
Spécialité en worldedit: La partie déclencheurs sauf le GUI.


MessagePosté le: 20/07/09 17:36    Sujet du message: Citer

Autrement je me pose une question concernant la différence (ou non) concernant la façon dont war3 gère les variables globales et celle dont il gère les variables locales.

J'ai entendu parler de "pile" et de "tas", qui à mon avis est une chose que l'on peut comparer à "mémoire vive" et "mémoire morte", mais dans la mémoire vive elle-même (ou peut-être que je me trompe). L'utilisation de la pile serait donc plus rapide et moins coûteuse que celle du tas.

Donc au premier abord je me suis dit que l'utilisation de variables globales dans des fonctions utilisées très souvent est plus efficace que l'utilisation de variables locales, puisque qu'elles sont créées une seule fois, et non créées, détruites, recréées, redétruites... mais ça ce serait dans le cas où les locales et les globales soient gérées de la même façon dans la mémoire.

Donc j'ai un doute Embarassed
_________________
Maximaxou@northrend

Projet Max Escape Creation (éditeur d'escapes : mazes/slides) : http://max.slid.free.fr/maxEscapeCreation/
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: 20/07/09 18:05    Sujet du message: Citer

Premièrement si tu es arrivé à un point où ton seul souci est de savoir si tu dois utiliser une globale ou une locale, tu n'as pas vraiment de soucis à te faire, car tu es déjà arrivé à un degré d'optimisation tel que les pouillèmes encore gagnés ne seront jamais perceptibles, cela satisfera juste ton égo et/ou ton perfectionnisme.
Dans l'hypothèse bien sûr où tu maitrises déjà des techniques permettant elles de réellement gagner en performance.

Recyclage plutôt que création/destruction d'handle (si c'est facilement faisable).
Utilisation d'un seul groupe unité pour les enum instantanés d'unités + codage dans le filter.
Codage dans des conditions plutôt que des actions.
Utilisation d'une seul dummy par joueur pour les spells triggerisés, etc.

Cela clarifié, il semblerait que pour une utilisation d'une variable locale cela n'est "plus rapide" qu'au bout de X fois d'utilisation dans la même fonction, compte tenu du temps de déclaration/destruction de la variable.
Je ne te dirais pas d'âneries je n'ai aucune idée de la valeur de "X".
Mais cela ne devrait pas dépasser la dizaine d'utilisation.

Outre le gain énorme ( Very Happy ) que procure l'utilisation d'une globale par une locale c'est que l'on peut raisonnablement ne pas la nullifier à la fin de la fonction, étant donné que sa valeur sera probablement réécrit plus tard en cours de jeu. (yeah on est pas OFF-TOPIC Cool )
C'est moins vrai pour les membres d'une struct, ou plus simplement une simple global array, car à un moment du jeu on peut avoir besoin de 100 instances de la struct puis plus tard ne jamais dépasser le 10.
Il est donc de bonne habitude de déclarer une method onDestroy qui nullifie les membres "handle" de la struct quand une instance de celle ci est détruite.

Maintenant cela rend ton code plus ugly, alors il faut se poser la question de la nécessité d'une telle chose.
Sache simplement que dans bien des cas l'utilisation d'une globale à la place d'une locale est plus "performant".
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Max
Floodeur prématuré


Inscrit le: 13 Jan 2009
Messages: 550
Sujets: 47
Spécialité en worldedit: La partie déclencheurs sauf le GUI.


MessagePosté le: 20/07/09 19:14    Sujet du message: Citer

Troll-Brain a écrit:
Premièrement si tu es arrivé à un point où ton seul souci est de savoir si tu dois utiliser une globale ou une locale, tu n'as pas vraiment de soucis à te faire, car tu es déjà arrivé à un degré d'optimisation tel que les pouillèmes encore gagnés ne seront jamais perceptibles, cela satisfera juste ton égo et/ou ton perfectionnisme.
Dans l'hypothèse bien sûr où tu maitrises déjà des techniques permettant elles de réellement gagner en performance.

Troll-Brain a écrit:
Ce n'est pas que je me soucie d'un tel degré de précision, mais j'aimerais bien comprendre ...

Pour moi c'est un peu la même chose, par contre j'essaie de me soucier d'un gros degré de précision concernant mes connaissances en programmation...
_________________
Maximaxou@northrend

Projet Max Escape Creation (éditeur d'escapes : mazes/slides) : http://max.slid.free.fr/maxEscapeCreation/
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: 20/07/09 19:44    Sujet du message: Citer

Citation:
Pour moi c'est un peu la même chose, par contre j'essaie de me soucier d'un gros degré de précision concernant mes connaissances en programmation...

Bah comme tu l'as dit c'est assez intuitif que l'utilisation d'une locale vs globale est plus lent, si la variable n'est utilisé qu'une seule fois.
Par contre en effet j'ignore pourquoi cela serait plus rapide à partir de X fois.

Pour la partie savoir, tu peux poser ta question sur wc3campaigns(www.wc3.net), y'a surement Pitzermike ou PiperDream, je confonds toujours les 2 noms, qui en savent plus à ce sujet.
Concernant l'aspect purement performance c'est vérifiable avec les fonctions natives de japi et la version 1.21 de war3.
_________________
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 -> Aide sur les déclencheurs Toutes les heures sont au format GMT + 1 Heure
Aller à la page 1, 2  Suivante
Page 1 sur 2
La question posée dans ce topic a été résolue !

 
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