online faq recherche accueil
 

Il y a 61 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici

 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet :

hélices de wisps

 
n°4588476
Maximaxou
rejoignez les fidèles du JASS
Posté le 22-03-2007 à 20:26:54  profilanswer
 

Bonjour tout le monde!
 
    Alors voila : ma précédente hélice de wisp calculait les positions des wisps 50 fois par seconde en utilisant les fonctions sinus et cosinus. Mon hélice étant dotée de 16 wisps + celui du centre, et ayant deux variantes d'hélices tournant en même temps, le jeu laggait un peu. Un boss m'a proposé une variante utilisant le décalage (offset) par rapport au wisp du milieu.  Je l'ai essayé mais j'ai énormément de fuites de mémoire et mon proc est utilisé à 30 % parfois plus rien que pour ces 3 hélices (pentium 4 : 3,5 GHz). Alors voici donc cette variante :
 
helice de wisps lvl 2 init
    Evénements
        Map initialization
    Conditions
    Actions
        Unité - Move Feu follet 0138 <gen> instantly to (Point(550.00, 1650.00))
        For each (Integer B) from 0 to 3, do (Actions)
            Boucle - Actions
                For each (Integer A) from 1 to 4, do (Actions)
                    Boucle - Actions
                        Unité - Create 1 Feu follet for Joueur 12 (Marron) at ((Position of Feu follet 0138 <gen> ) offset by (75.00 x (Real((Integer A)))) towards (90.00 x (Real((Integer B)))) degrees) facing Orientation bâtiment par défaut degrees
                        Groupe unité - Add (Last created unit) to units_lvl[2] //ne prêtez pas attention à cette action
                        Groupe unité - Add (Last created unit) to helice_wisp_lvl2
                        Unité - Set mana of (Last created unit) to (75.00 x (Real((Integer A)))) //le mana est ici utilisé comme une deuxième custom value
                        Unité - Set the custom value of (Last created unit) to (90 x (Integer B))
 
 
helice et cercle lvl 2 turning
    Evénements
        Temps - Every 0.02 seconds of game time
    Conditions
    Actions
        Set angle_helice_lvl2 = (angle_helice_lvl2 + 1.50)
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            Si - Conditions
                angle_helice_lvl2 Supérieur ou égal à 360.00
            Alors - Actions
                Set angle_helice_lvl2 = (angle_helice_lvl2 - 360.00)
            Sinon - Actions
        Groupe unité - Pick every unit in helice_wisp_lvl2 and do (Actions)
            Boucle - Actions
                Unité - Move (Picked unit) instantly to ((Position of Feu follet 0138 <gen> ) offset by (Mana of (Picked unit)) towards (angle_helice_lvl2 + (Real((Custom value of (Picked unit))))) degrees)
 
 
J'aimerais savoir pourquoi il y a autant de fuites de mémoire et pourqoi le processeur est autant utilisé.
 
Sinon je pensais à une solution : stocker les différentes positions des wisps dans des variables de type point.
Ca ferait donc 4 * 360/1.5 = 960 variables (4 tableaux de 240 variables).
Il y aurait également un compteur allant de 0 à 239 et s'incrémentant 50 fois par seconde. (à chaque mouvement de wisp)
Ca me paraît beaucoup mais le processeur n'aurait rien à faire et il ne me paraît pas y avoir de fuite de mémoire de cette manière.
De plus si je ne me trompe pas, une variable de type point, c'est deux réels, donc ça prend peut de place ?


Message édité par Maximaxou le 22-03-2007 à 20:30:02

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4588478
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 22-03-2007 à 20:58:50  profilanswer
 

les leak viennent des points et des groupes unités, il faut les remove/destroy aprés utilisation
Ton délencheur est utilisé 50 fois par seconde  :D  
Essaye 0.04 ca divise par 2 et l'effet devrait rester potable
 
PS : c'est qui le nom du boss en memory leak ?
 
Passe au jass pour cette fonction, le if/then/else/multiple fonctions crée plusieurs fonctions inutilement comme son nom l'indique.
La différence de performance est peu être trés légère mais comme c'est une boucle tu peux avoir un meilleur résultat
Ou tout simplement fait un if/then else unique, étant donné que tu n'as que 2 actions ( si true ou false) il n'y a pas de problème.
Même remarque pour le pick every.
Je sais c'est plus chiant à éditer aprés, mais de toute façon tu n'aimes pas le gui ....


Message édité par Troll-Brain le 22-03-2007 à 21:10:47

---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4588480
Maximaxou
rejoignez les fidèles du JASS
Posté le 22-03-2007 à 21:10:28  profilanswer
 

0.04 c moche. Quant au memory leak je ne vois pas pkoi il y en aurait vu que les variables sont constantes. Si il y en a je ne vois pas ce qu'est le memory leak en fait. Je pense qu'ici les variables prennent de la mémoire mais qu'il n'y a pas de fuite de mémoire.


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4588481
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 22-03-2007 à 21:13:20  profilanswer
 

je ne programme pas mais je peux te dire que c'est une sombre histoire de pointeur.
Tout ce qui n'est pas réel,entier,boléen utilise une autre "variable" (désolé pour le terme) comme pointeur.
Si tu ne le remove/destroy pas elle continue à prendre de la place


---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4588483
Maximaxou
rejoignez les fidèles du JASS
Posté le 22-03-2007 à 21:27:32  profilanswer
 

Pour faire ces quatre variables il me faudrait un tableau à deux dimensions ça serait beaucoup plus facile à utiliser, mais je ne crois pas que c'est possible, si ?


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4588484
Maximaxou
rejoignez les fidèles du JASS
Posté le 22-03-2007 à 21:29:36  profilanswer
 

Je sais bien qu'elle prend de la place, mais ça n'est pas très important. Le fait qu'elle prenne de la place n'est pas une fuite de mémoire mais une simple utilisation normale de la mémoire. Les fuites de mémoire, c'est quand la mémoire ne cessent d'être de plus en plus utilisée.


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4588485
Maximaxou
rejoignez les fidèles du JASS
Posté le 22-03-2007 à 21:37:39  profilanswer
 

"Tout ce qui n'est pas réel,entier,boléen utilise une autre "variable" (désolé pour le terme) comme pointeur.  
Si tu ne le remove/destroy pas elle continue à prendre de la place"
 
Ok mais un point n'est pas simplement un couple de réels ?


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4588486
Maximaxou
rejoignez les fidèles du JASS
Posté le 22-03-2007 à 22:09:35  profilanswer
 

Huh, je comprends pas. Juste pour 1000 petits points la map met 3 heures a se charger et ça remplit la mémoire. ON dirait que ça boucle à l'infini et que ça n'arrête pas de créer des points ! Au secours ! 565 mo de mémoire utilisée par war3! AHHHHHHHHHHHH 580 !!!!!!!!
 
 
edit :  
Ah non lol. C'est des unités qu'il me créait à l'infini :

Code :
  1. loop
  2.     exitwhen i>3
  3.         call CreateNUnitsAtLoc( 1, 'ewsp', Player(11), centre, bj_UNIT_FACING )
  4.         call SetUnitUserData( GetLastCreatedUnit(), 60*i )
  5.         call GroupAddUnitSimple( GetLastCreatedUnit(), udg_helice_wisp_lvl2_1 )
  6.     endloop


 
J'ai oublié d'incrémenter i. Il ne devait pas y avoir de protection contre les boucles infinies ?


Message édité par Maximaxou le 22-03-2007 à 22:14:35

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4588487
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 22-03-2007 à 22:30:59  profilanswer
 

Maximaxou a écrit :

Ok mais un point n'est pas simplement un couple de réels ?


En théorie oui mais apparament non  :D
 
Pour les boucles infnies j'ai déja essayé, et la fonction fait un "return" si une boucle est infinie, la valeur maxi que peut durer une fonction sans compter les wait est de 1ms (Source : Ayane)
 
Maintenant tu n'as peut être pas le dernier patch ?


Message édité par Troll-Brain le 22-03-2007 à 22:31:24

---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4588488
Maximaxou
rejoignez les fidèles du JASS
Posté le 22-03-2007 à 22:32:49  profilanswer
 

J'ai fini mes triggers mais les wisp restent tous au centre.  Voici mon code :
 

Code :
  1. //à l'initialisation de la map :
  2. function Trig_helice_de_wisps_lvl_2_init_Copier_Actions takes nothing returns nothing
  3.     local integer i = 0
  4.     local integer j = 1
  5.     local real angle = 0
  6.     local location centre = Location( 550, 1650)
  7.     loop
  8.     exitwhen i>239
  9.         set udg_helice_lvl_2_position_1[i] = PolarProjectionBJ(centre,  75, Deg2Rad(angle) )
  10.         set udg_helice_lvl_2_position_2[i] = PolarProjectionBJ(centre, 150, Deg2Rad(angle) )
  11.         set udg_helice_lvl_2_position_3[i] = PolarProjectionBJ(centre, 225, Deg2Rad(angle) )
  12.         set udg_helice_lvl_2_position_4[i] = PolarProjectionBJ(centre, 300, Deg2Rad(angle) )
  13.     set i = i + 1
  14.     set angle = angle + 1.5
  15.     endloop
  16. //cette boucle est répétée pour chaque groupe mais je ne la remets pas :
  17.     set i = 0                                 
  18.     loop
  19.     exitwhen i>3
  20.         call CreateNUnitsAtLoc( 1, 'ewsp', Player(11), centre, 0 )
  21.         call SetUnitUserData( GetLastCreatedUnit(), 60*i )
  22.         call GroupAddUnitSimple( GetLastCreatedUnit(), udg_helice_wisp_lvl2_1 )     set i = i + 1
  23.     endloop
  24. endfunction


 

Code :
  1. //toutes les 0.02 secondes :
  2. //il y a une fonction similaire pour chaque autre groupe :
  3. function Trig_helice_lvl_2_1 takes nothing returns nothing
  4.     local unit wisp = GetEnumUnit()
  5.     local integer custom_value = GetUnitUserData(wisp)
  6.     call SetUnitPositionLoc( wisp, udg_helice_lvl_2_position_1[custom_value] )
  7.     if ( custom_value>=239 ) then
  8.         call SetUnitUserData( wisp, 0 )
  9.     else
  10.         call SetUnitUserData( wisp, custom_value + 1 )
  11.     endif
  12. endfunction
  13. function Trig_helice_lvl_2_Actions takes nothing returns nothing
  14.     call ForGroupBJ( udg_helice_wisp_lvl2_1, function Trig_helice_lvl_2_1 )
  15.     call ForGroupBJ( udg_helice_wisp_lvl2_2, function Trig_helice_lvl_2_2 )
  16.     call ForGroupBJ( udg_helice_wisp_lvl2_3, function Trig_helice_lvl_2_3 )       
  17.     call ForGroupBJ( udg_helice_wisp_lvl2_4, function Trig_helice_lvl_2_4 )
  18. endfunction


 
Là je ne vois vraiment pas où je me suis gourré :/ .


Message édité par Maximaxou le 22-03-2007 à 22:44:13

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4588489
Maximaxou
rejoignez les fidèles du JASS
Posté le 22-03-2007 à 22:33:37  profilanswer
 

J'ai le dernier patch je joue sur bnet xD. Comprends pas non plus pourquoi il a pas quitté la boucle.
 
 

Citation :

Je sais c'est plus chiant à éditer aprés, mais de toute façon tu n'aimes pas le gui ....


 Tout dépend : grâce au GUI tu n'as pas sans arrêt besoin de chercher des fonctions ni non plus de te rappeler le nom de tes variables etc. Donc j'utilise le GUI le plus possible. Par contre je passe au JASS dès qu'il s'agit de copier une même action 10 fois avec un chiffre qui change (ex: set slide_j[1] = trg_slide_j1) ou dès que je veux faire un truc un peu poussé, ou encore éviter les fuites de mémoires pour les déclo qui sont exécutés souvent. Bref, environ la moitié du temps.

Message cité 1 fois
Message édité par Maximaxou le 22-03-2007 à 22:43:25

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4588490
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 22-03-2007 à 22:45:50  profilanswer
 

Maximaxou a écrit :

J'ai le dernier patch je joue sur bnet xD. Comprends pas non plus pourquoi il a pas quitté la boucle.


a mon avis la boucle a du être quitté, tant que tu y es teste en faisant apparaitre un texte message ,aprés la boucle et pendant la boucle.
C'est simplement qu'un grand nombre d'unité prend beaucoup en mémoire vive, à mon avis quelques centaines la mémoire vive doit dèjà le ressentir ...


---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4588491
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 22-03-2007 à 22:46:11  profilanswer
 

omg ta signature >.<


---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4588492
Maximaxou
rejoignez les fidèles du JASS
Posté le 22-03-2007 à 22:58:14  profilanswer
 

Non la boucle n'a pas été quittée. La preuve la map se chargeait indéfinniment (est le chargement de la map correspond en partie aux déclo dont l'évènement est map init) en créant des unités et le processeur était à fond. La mémoire vive montait à la vitesse de plusieurs mo par seconde.


Message édité par Maximaxou le 22-03-2007 à 22:59:01

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4588493
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 22-03-2007 à 23:06:18  profilanswer
 

Je ne crois pas que tu gagnes énormément en performance en ayant créé au préalable des variables globales et en les indexant plutôt que de calculer les points à chaque fois.
Là je n'ai plus le temps mais si tu ne trouves pas tout seul ou si personne n'a pu t'aider, je jetterait un coup d'oeil plus attentif demain


---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4588494
Maximaxou
rejoignez les fidèles du JASS
Posté le 22-03-2007 à 23:08:41  profilanswer
 

Ben si justement, le processeur n'a plus rien à faire.
 
J'ai un peu réfléchi aux fuites de mémoire et je crois que j'ai compris. Si tu crées une variable globale point, que tu l'utilises une fois seulement et que tu ne la détruis pas, elle reste en mémoire. Et donc si tu en crées souvent tu perds de plus en plus de mémoire. Quant aux variables locales, elles sont détruites dès la sortie de la fonction, c'est pourquoi elle ne provoquent pas de fuites de mémoire. Il faudrait que Ayane me confirme ça :) .


Message édité par Maximaxou le 22-03-2007 à 23:14:13

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4588497
Maximaxou
rejoignez les fidèles du JASS
Posté le 23-03-2007 à 12:30:35  profilanswer
 

Bon ben j'ai trouvé mes 2 erreurs :
 
_Il ne faut pas mettre Deg2Rad(angle) mais angle tout court.  (l. 11-14 de l'initialisation)
_ pour cette ligne là :
    call SetUnitPositionLoc( wisp, udg_helice_lvl_2_position_1[custom_value] )
ds les autres fonctions j'avais oublié de changer la variable :
udg_helice_lvl_2_position_2
udg_helice_lvl_2_position_3       (c'était resté avec un 1 partout)
puis udg_helice_lvl_2_position_4  
 
Donc maintenant ça fontionne. Quant au CPU, comme prévu, il ne fait aucun calcul (war3.exe prend 2% au total). Et la mémoire elle monte pas (je me demande si Ayane saurait nous trouver un déclo plus performant que ça). Comme je le disais c'est le fait de créer souvent des points sans les enlever qui provoque des fuites de mémoire. Hors j'ai créé des points au début et c'est tout. C'est cool je vais pouvoir faire autant d'hélices que je veux maintenant :).
 

Citation :

Je ne crois pas que tu gagnes énormément en performance en ayant créé au préalable des variables globales et en les indexant plutôt que de calculer les points à chaque fois.


Apparemment le CPU lui, il est pas d'accord avec toi :sarcastic:. (avant avec les 3 hélices tournant en même temps, war3.exe utilisait le CPU à plus de 30%)
 
 

Citation :

omg ta signature >.<


Elle est bien hein ? :)
 
 
 
PS : je ne comprends toujours pas bien ce qui provoque les fuites de mémoires exactement :o (mais plutôt ce qui ne les provoque pas ^^)

Message cité 1 fois
Message édité par Maximaxou le 23-03-2007 à 12:41:48

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4588503
Insomniak
Posté le 23-03-2007 à 17:55:15  profilanswer
 

Les fuites de mémoire, ça peut venir de deux choses :
-Soit une variable alloquées dynamiquement n'a pas été delete. Mais en générale, ça provoque une fuite de mémoire à la fin de programme, pas pendant.
 
-Soit tu dépasses la taille maximum d'un tableau. Par exemple, tu as un tableau arf[] de taille 14 et tu fais arf[16] = 3.

n°4588504
Kuchiki By​akuya
Stfu.
Posté le 23-03-2007 à 19:31:10  profilanswer
 

Maximaxou a écrit :


Elle est bien hein ? :)


 
Je crois savoir qu'il n'aime pas DotA  [:goffterdom:7]  Moi non plus d'ailleurs  [:goffterdom:5]  

n°4588506
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 23-03-2007 à 19:57:15  profilanswer
 

Ce que l'on appelle une fuite de mémoire ce sont des "objets" qui ont été crées mais ne sont plus utilisées et continuent à occuper de la mémoire inutilement.
donc lorsque tu crées des points (variable locale ou non), lorsque tu fais un pick every cela créé un groupe non supprimé aprés utilisation, etc.
Pour les groupes tu peux rajouter le custom script set bj_wantDestroyGroup=true juste avant la fonction
lorqu'une fonction en gui est utilisée elle remet cette variable globale à false, et si elle était à true elle suprime le groupe ainsi créé
 
sinon intéressant à savoir pour le processeur


Message édité par Troll-Brain le 23-03-2007 à 20:00:10

---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4588510
Maximaxou
rejoignez les fidèles du JASS
Posté le 24-03-2007 à 03:48:35  profilanswer
 

Citation :

lorsque tu fais un pick every cela créé un groupe non supprimé aprés utilisation


Non c'est faux. Un pick evey prend un groupe en paramètre mais ne crée pas de groupe. Quant à wantDestroyGroup, il sert lorsqu'il est à true, à détruire le groupe pris en paramètre de la fonction. En voici la preuve :

Code :
  1. function ForGroupBJ takes group whichGroup, code callback returns nothing
  2.     // If the user wants the group destroyed, remember that fact and clear
  3.     // the flag, in case it is used again in the callback.
  4.     local boolean wantDestroy = bj_wantDestroyGroup
  5.     set bj_wantDestroyGroup = false
  6.     call ForGroup(whichGroup, callback)
  7.     // If the user wants the group destroyed, do so now.
  8.     if (wantDestroy) then
  9.         call DestroyGroup(whichGroup)
  10.     endif
  11. endfunction


Tu as donc raison quant au custom script set_bj_wantDestroyGroup = true à placer avant le pick every.
Si l'on ne veut pas détruire le groupe, il vaut mieux utiliser ForGroup et non ForGroupBJ (je vais changer ça dans ma fonction), pour éviter un if false then.......endif inutile à chaque fois.
 

Citation :

Les fuites de mémoire, ça peut venir de deux choses :  
-Soit une variable alloquées dynamiquement n'a pas été delete. Mais en générale, ça provoque une fuite de mémoire à la fin de programme, pas pendant.  
 
-Soit tu dépasses la taille maximum d'un tableau. Par exemple, tu as un tableau arf[] de taille 14 et tu fais arf[16] = 3.


 
Tes deux choses sont en fait les mêmes puisque le dépassement d'un tableau provoque l'allocation d'une variable. Sinon je ne vois pas pourquoi le fait qu'une variable soit créée dynamiquement provoquerait une fuite de mémoire et n'en provequerait pas si elle était créée normalement.
Je réappuie mon avis la dessus : c'est la création régulière de variables (quelles quelles soient) utilisées juste après leur création mais non par la suite, sans être supprimées, qui provoquent des fuites de mémoire. Enfin qu'on le fasse régulièrement ou non, c'est une fuite de mémoire, mais celle que l'on sent dans le jeu, c'est la fuite régulière. Ce que j'aimerais savoir, c'est quoi d'autre provoque des fuites.
 
PS: il ne faut pas confondre fuite de mémoire (non suppression d'une variable qui ne sera plus jamais utilisée) et utilisation normale de la mémoire (création d'une variable qui sera utilisée longtemps (jusqu'à sa suppression ou la fin du jeu) : avec allocation dynamique ou non).

Message cité 1 fois
Message édité par Maximaxou le 24-03-2007 à 03:52:16

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4588511
Maximaxou
rejoignez les fidèles du JASS
Posté le 24-03-2007 à 04:03:24  profilanswer
 

Une fois que je n'ai plus besoin de mon hélice, je fais ceci :

Code :
  1. local integer i = 0
  2.     loop
  3.     exitwhen i>239
  4.         call RemoveLocation( udg_helice_lvl_2_position_1[i] )
  5.         call RemoveLocation( udg_helice_lvl_2_position_2[i] )
  6.         call RemoveLocation( udg_helice_lvl_2_position_3[i] )
  7.         call RemoveLocation( udg_helice_lvl_2_position_4[i] )
  8.     set i = i+1
  9.     endloop


Je me demande s'il existe un moyen de supprimer chacune de ces variables directement sans avoir à le faire point par point, ce qui serait beaucoup plus rapide à l'exécution.


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4588515
Insomniak
Posté le 24-03-2007 à 10:49:01  profilanswer
 

Maximaxou a écrit :

Tes deux choses sont en fait les mêmes puisque le dépassement d'un tableau provoque l'allocation d'une variable. Sinon je ne vois pas pourquoi le fait qu'une variable soit créée dynamiquement provoquerait une fuite de mémoire et n'en provequerait pas si elle était créée normalement.


 
 
C'est uniquement si elle n'est pas delete apres (je parle en C++...).
 
Dans le C++, tu fais :
 

Code :
  1. class creep *blabla = new creep,
  2. creep->setLife(35);
  3. delete creep;


La ou ça provoque une fuite de mémoire, c'est si tu fais
 

Code :
  1. for (int i=0; i<800; i++)
  2. {
  3.      class creep *blabla = new creep,
  4.      creep->setLife(35);
  5. }


 
La 800 creep ne sont pas supprimés, prennent de la place en mémoire et provoque un ramage si la classe prend beaucoup de place en mémoire.
 

n°4588516
Maximaxou
rejoignez les fidèles du JASS
Posté le 24-03-2007 à 11:04:06  profilanswer
 

Mais si tu les utilises tes 800 creeps, ça n'est pas une fuite de mémoire.  
Tu crées tes maps en C++ ?


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4588519
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 24-03-2007 à 14:26:54  profilanswer
 

Citation :

lorsque tu fais un pick every cela créé un groupe non supprimé aprés utilisation
Non c'est faux. Un pick evey prend un groupe en paramètre mais ne crée pas de groupe. Quant à wantDestroyGroup, il sert lorsqu'il est à true, à détruire le groupe pris en paramètre de la fonction.


 
Oui c'est vrai mais ce que je voulais dire c'est un exemple de ce type :
 

Code :
  1. Groupe unité - Pick every unit in (Units in (Playable map area)) and do (Actions)
  2.     Boucle - Actions
  3.         Unité - Kill (Picked unit)


 

Code :
  1. function Trig_D__clencheur_sans_titre_001_Func001A takes nothing returns nothing
  2.     call KillUnit( GetEnumUnit() )
  3. endfunction
  4. function Trig_D__clencheur_sans_titre_001_Actions takes nothing returns nothing
  5.     call ForGroupBJ( GetUnitsInRectAll(GetPlayableMapRect()), function Trig_D__clencheur_sans_titre_001_Func001A )
  6. endfunction


 
un groupe est créé : GetUnitsInRectAll(GetPlayableMapRect())
 
sinon pour les memory leak tu as tout à fait raison


Message édité par Troll-Brain le 24-03-2007 à 14:27:48

---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4588523
Insomniak
Posté le 24-03-2007 à 18:41:55  profilanswer
 

Maximaxou a écrit :

Mais si tu les utilises tes 800 creeps, ça n'est pas une fuite de mémoire.  
Tu crées tes maps en C++ ?


 
 
Non, en fait mon exemple est mal placé, ce que je voulais dire c'est que si à chaque frame tu créer une nouvelle creep, mais que tu la delete jamais, ben à chaque frame ton programme prend un peu plus de place, et pour finir fait planter le jeu.
 
Les maps je les créer pas en C++, mais par contre j'ai d'autre projets annexes que je code en C++.

n°4588557
Maximaxou
rejoignez les fidèles du JASS
Posté le 25-03-2007 à 20:39:33  profilanswer
 

Citation :

Oui c'est vrai mais ce que je voulais dire c'est un exemple de ce type :  
 

Code :
  1. Groupe unité - Pick every unit in (Units in (Playable map area)) and do (Actions)
  2.     Boucle - Actions
  3.         Unité - Kill (Picked unit)



 
J'ai créé un trigger de test pour vérifier ceci :

Code :
  1. test groupe
  2.     Evénements
  3.         Temps - Every 0.01 seconds of game time
  4.     Conditions
  5.     Actions
  6.         Groupe unité - Pick every unit in (Units in Région 000 <gen> ) and do (Actions)
  7.             Boucle - Actions
  8.                 If (All Conditions are True) then do (Then Actions) else do (Else Actions)
  9.                     Si - Conditions
  10.                         ((Picked unit) is paused) Egal à TRUE
  11.                     Alors - Actions
  12.                         Unité - Reprendre (Picked unit)
  13.                     Sinon - Actions
  14.                         Unité - Pause (Picked unit)


En effet, cela provoque une fuite de mémoire de pratiquement 1 mo/s (il y a environ 50 unités dans 'Region 000').
 
Je rajoute la mise à true de want destroy group :

Code :
  1. test groupe
  2.     Evénements
  3.         Temps - Every 0.01 seconds of game time
  4.     Conditions
  5.     Actions
  6.         Custom script:   set bj_wantDestroyGroup=true
  7.         Groupe unité - Pick every unit in (Units in Région 000 <gen> ) and do (Actions)
  8.             Boucle - Actions
  9.                 If (All Conditions are True) then do (Then Actions) else do (Else Actions)
  10.                     Si - Conditions
  11.                         ((Picked unit) is paused) Egal à TRUE
  12.                     Alors - Actions
  13.                         Unité - Reprendre (Picked unit)
  14.                     Sinon - Actions
  15.                         Unité - Pause (Picked unit)


Il y a beacoup moins de fuites de mémoires, mais il y en a toujours. (env 1mo en un peu moins de dix secondes)
Cette fuite de mémoire vient bien de ce trigger puisque lorsque je le désactive, il n'y a plus aucune fuite. Mais d'où exactement ?
 


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4588559
Insomniak
Posté le 25-03-2007 à 21:08:08  profilanswer
 

Essaie de désactiver toutes les actions/toutes les conditions dans ton pick Every Unit pour voir ?

n°4588560
Maximaxou
rejoignez les fidèles du JASS
Posté le 25-03-2007 à 21:44:38  profilanswer
 

pas con


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4588572
Maximaxou
rejoignez les fidèles du JASS
Posté le 26-03-2007 à 14:30:55  profilanswer
 

Sinon j'aimerais savoir ce qui est le plus rapide à l'exécution, entre pause (resp. unpause) unit et hide (resp. unhide) unit.


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4588574
gro_shaman
Ah... World edit...
Posté le 26-03-2007 à 14:41:20  profilanswer
 

La difference doit etre negligeable, non?  
Pourquoi as-tu besoin de savoir ca ?


---------------
http://www.acathla.com/
n°4588575
Maximaxou
rejoignez les fidèles du JASS
Posté le 26-03-2007 à 16:03:24  profilanswer
 

J'ai besoin de savoir ça parce que je veux cacher ou mettre en pause les monstres des niveaux suivants, pour éviter qu'ils attaquent les persos. (c ds un escape) Et ça fait beaucoup d'unités à réactiver en même temps.


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4588590
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 26-03-2007 à 19:34:51  profilanswer
 

[éclair de génie] Ce n'est pas un leak mais juste une utilisation normale de la mémoire elle n'a tout simplement pas le temps d'être libérée, essaye avec un événement moins fréquent ou avec moins d'unité tu verras[/cerveau grillé]


---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4588596
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 26-03-2007 à 20:01:50  profilanswer
 

Maximaxou a écrit :

J'ai besoin de savoir ça parce que je veux cacher ou mettre en pause les monstres des niveaux suivants, pour éviter qu'ils attaquent les persos. (c ds un escape) Et ça fait beaucoup d'unités à réactiver en même temps.


 
utilise ce que j'ai dit precédement fait une boucle 0.00 et beaucoup d'unités avec pour action hide/unhide, regarde la vitesse à laquelle la mémoire se remplit, puis avec pause/reprendre et compare les résultats  :wahoo:  
 


---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4588598
Maximaxou
rejoignez les fidèles du JASS
Posté le 26-03-2007 à 20:42:59  profilanswer
 


Je ne parle pas de la mémoire, je c kil n'y a pas de leak ici. De toute façon c'est une action qui s'effectue une fois en cours de jeu. Je parle du temps d'exécution, pour éviter les désynchronisation entre les joueurs.


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4588602
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 26-03-2007 à 20:53:23  profilanswer
 

Maximaxou a écrit :

Je ne parle pas de la mémoire, je c kil n'y a pas de leak ici. De toute façon c'est une action qui s'effectue une fois en cours de jeu. Je parle du temps d'exécution, pour éviter les désynchronisation entre les joueurs.


et bien au plus la memoire allouée sera grande au plus la fonction est lente non ?


Message édité par Troll-Brain le 26-03-2007 à 20:53:41

---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4588630
Maximaxou
rejoignez les fidèles du JASS
Posté le 27-03-2007 à 20:02:56  profilanswer
 

Même s'il n'y a aucune fuite de mémoire, toute action a forcément un temps d'exécution...


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4588637
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 27-03-2007 à 21:06:56  profilanswer
 

Maximaxou a écrit :

Même s'il n'y a aucune fuite de mémoire, toute action a forcément un temps d'exécution...


sans blague ..
Enfn ce que je voulas dire c'est que pour moi la vitesse interessante est celle à laquelle la fonction libérera la mémoire , néammoins il est vrai que celle de son éxécution est importante aussi
M'enfin je me disais peut être existe t'il un lien entre ces 2 temps, voir la même valeur :D
 


---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4588654
Maximaxou
rejoignez les fidèles du JASS
Posté le 28-03-2007 à 02:23:02  profilanswer
 

Sa doit être un truc du genre une droite affine : temps d'exécution de la fonction + cte * le leak ^^ xD


---------------
Dota c'est bien, le slide c'est encore mieux !

Aller à :
Ajouter une réponse