Forums Développement Multimédia

Aller au contenu

- - - - -

optimisation appli, movieClip et autres...

optimisation CODE as3 movieclip

12 réponses à ce sujet

#1 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 259 messages

Posté 06 July 2017 - 12:00 PM

Et Hop !

Ci-joint la 1er ou 3eme question, ceci étant fonction du sens de lecture. Bref....

Je sais que de nombreux sujets abordent ce problème.
Mais je n'y retrouve pas mes petits...

1. Pourquoi peut-on désactiver un écouteur qui n'a pas été activé alors qu'à contrario il est impossible d’effacer un MovieClip absent ?

2. N'y a t'il pas de propriété pour les MovieClip permettant de savoir si ils sont affichés ou non ? J'ai pas trouvé et je leur donne donc une propriété "active" mais cela ne me semble pas la meilleure méthode...

3. Dés lors que je tape " var mc : new MovieClip ", à moins de me tromper, celui ci existe, il à des propriétés, x,y,alpha etc... C'est donc de la mémoire à perte ? moins néanmoins j'imagine qu'après un addChild de ce même clip ? Donc faut-il tout mettre à NULL et comment s'y prendre dans une routine ?

Merci de m'avoir lu.

Bonne journée !

#2 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6997 messages

Posté 06 July 2017 - 17:45 PM

Salut,

1 - parce qu'un écouteur écoute un événement (click, mousemove, ...), tu ne fais que l'activer ou le désactiver, si tu le désactive sans l'avoir activé il ne fait tout simplement rien, tandis qu'un clip ne peut être effacé si il n'a pas été créé car il n'a pas de référence qui y correspond. Pour effacer ce clip en particulier le programme à besoin de savoir où il se trouve, qui il est, et si il n'est pas créé alors il n'existe pas.

2 - if(this.visible==true)
Un movieClip hérite de DisplayObject (un objet d'affichage de base), pour les propriétés c'est ici : http://help.adobe.co...playObject.html

3 - oui, quand tu créer une variable (var) elle prend de la place en mémoire, si tu la vide (null) alors elle sera supprimée au prochain passage du ramasse miettes (garbage collector), mais la question ainsi que celle du dessus dévoilent un problème de structure de ton code.

Pourquoi créer une variable de type MovieClip si tu n'en as pas besoin dans le programme ?
Crée une variable vide (si tu veux qu'elle soit globale) et valorise là avec un movieClip quand tu en as besoin.

Pourquoi vouloir savoir si un clip est affiché ou pas ?
Tu devrais normalement savoir exactement ce que contiennent tes displayList à n'importe quel moment, si ce n'est pas le cas c'est que tu perds la maitrise de ton code et ne sais plus ce qui est affiché et quand. C'est comme jouer du piano mais devoir regarder le clavier car on ne connaît pas les touches. Prenons l'exemple d'un jeu vidéo, je ne dois en aucun cas regarder ce qu'il se passe à l'affichage pour savoir comment doit réagir mes personnages, l'affichage c'est le truc qu'on fait en dernier après avoir tout calculé dans le code, donc vouloir savoir si un truc est affiché ou pas c'est dépendre de l'affichage pour créer des actions, et ça c'est pas bon, ton programme tourne plus vite que l'affichage ne se crée, tu va donc perdre en précision et dans un jeu ça peut être catastrophique, par exemple pour les collisions ou les événements timés.

#3 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1747 messages

Posté 06 July 2017 - 18:15 PM

pour savoir si un clip est affiché, tu peux utilisé

function isAdded(child:DisplayObject):Boolean
{
  var value:Boolean = true;
  try
  {
    this.getChildIndex(child);
  }
  catch (err:Error)
  {
    value = false;
  }
  finally
  {
    return value;
  }
}

trace( isAdded( clip ) );
 


#4 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 259 messages

Posté 06 July 2017 - 20:32 PM

Bonsoir et merci !

1 = OK !

2 : Sauf votre Honneur Mr. Spi la propriété du clip est "true" par défaut, qu'il soit affiché ou non, qu'il soit addChildé ou non :

var toto :  MovieClip = new Mc;
trace (toto.visible);
// Affiche "true"
addChild(toto);
trace (toto.visible);
// Affiche "true"
 

2.bis : Merci Pol mais autant créer ma propre propriété. (???)

3. oui je sais. J'ai tout sur la timeline pour ce projet et de fait c'est un peu une maison à jolie fille facile.
toujours est-il que je n'arrive pas à rendre mon objet null sur ce type de phrasé, problème de syntaxe sans doute...

while (this.numChildren > XXX) this.removeChildAt(this.numChildren-1);
 

Ça efface ok mais non éligible de ce que j'ai compris au garbage collector....

Grand merci à vous !

#5 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6997 messages

Posté 06 July 2017 - 20:40 PM

Citation

2 : Sauf votre Honneur Mr. Spi la propriété du clip est "true" par défaut, qu'il soit affiché ou non, qu'il soit addChildé ou non :

Si tu lis la description de la propriété :


Citation

Indique si l’objet d’affichage est visible ou non. Les objets d’affichage qui ne sont pas visibles sont désactivés. Par exemple, si visible=false pour une occurrence InteractiveObject, il est impossible de cliquer sur cette dernière.

Exemple :
Le code suivant utilise un objet Timer pour appeler une fonction qui modifie de façon périodique la propriété visible d’un objet d’affichage, ce qui produit un effet de clignotement :


import flash.text.TextField;
import flash.utils.Timer;
import flash.events.TimerEvent;

var tf:TextField = new TextField();
tf.text = "Hello.";
addChild(tf);

var tim:Timer = new Timer(250);
tim.start();
tim.addEventListener(TimerEvent.TIMER, blinker);

function blinker(event:TimerEvent):void {
        tf.visible = !tf.visible;
}
 
Donc tu peux utiliser la propriété "visible" pour afficher ou cacher un objet d'affichage, comme un clip ou un sprite.
Puis vérifier que cet objet est visible ou non à n'importe quel moment.
Ca n'a pas de rapport direct avec "addchild" qui ajoute un objet à une liste d'affichage, "visible" indique si ce clip est visible ou pas dans la liste d'affichage (mais il y reste présent).
AddChild permet d'ajouter un objet à une liste d'affichage, par défaut sa propriété est "visible=true" donc par défaut il est aussi affiché, mais tu peux le cacher en passant la propriété à "false", il reste présent mais on ne le vois plus et il n'est plus interactif.

#6 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6997 messages

Posté 06 July 2017 - 20:48 PM

Citation

Ça efface ok mais non éligible de ce que j'ai compris au garbage collector....

Le Garbage collector passe un peu quand il veut, il supprimera tous les objets n'ayant plus aucune référence ou des références faibles (weaks).
Pour qu'un objet n'ai plus de référence il faut qu'il ne soit plus présent nulle part (dans un tableau, dans un autre objet, etc...), n'ai plus d'écouteur (sauf avec une référence faible : weak) et que la variable soit passée à "null" ou d'utiliser "dispose".

Ce que tu fais avec :
while (this.numChildren) this.removeChildAt(0);

C'est de supprimer des objets de la liste d'affichage, mais les objets continuent d'exister.
Il faut bien comprendre la différence entre un truc qui existe et un truc qui est affiché.
Un objet existe dans le code sans pour autant qu'il soit affiché, donc le retirer d'une liste d'affichage ne suffit pas à détruire l'objet.

Exemple, si je fais :


var monobjet = new MovieClip();
monobjet.x = 120;
trace(monobjet.x);
 

On récupère bien la propriété x de l'objet, pourtant il n'est affiché nulle part.
C'est pour ça que je te dis plus haut que te fier à l'affichage d'un objet pour connaitre son existence n'est pas une bonne solution.

Pour détruire l'objet tu dois faire :

monobjet = null;

Là il est éligible au GC, qui passera quand il veut.

#7 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1747 messages

Posté 06 July 2017 - 20:54 PM

Citation

Merci Pol mais autant créer ma propre propriété. (???)

oui et non, tu es obligé de créer une propriété pour chaque clip alors que là, ça fonctionne pour tous les clips

avec une classe

package com.utils
{
  import flash.display.DisplayObject;

  public class ClipUtil
  {
        public static function isAdded(child:DisplayObject):Boolean
        {
          var value:Boolean = true;
          try
          {
                child.parent.getChildIndex(child);
          }
          catch (err:Error)
          {
                value = false;
          }
          finally
          {
                return value;
          }
        }
  }
}
 


import com.utils.ClipUtil;

trace( ClipUtil.isAdded( clip ) );
 


#8 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 259 messages

Posté 06 July 2017 - 21:04 PM

Bon bah voilà !

Merci les gars :smile: !

Dernière demande... Svp...

while (this.numChildren) this.removeChildAt(0);
 

Comment ici je peux Rendre l'état de mon objet NULL.
C'est juste un problème de syntaxe pour moi...

this = null ???

tiens...
J'ai pas essayé cette dernière...

Semaine prochaine je reprends à 0 Thibault Imbert. OUinnnnn....

#9 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6997 messages

Posté 06 July 2017 - 21:13 PM

Citation

Comment ici je peux Rendre l'état de mon objet NULL.

Ma méthode (on a chacun la sienne) c'est d'utiliser des tableaux pour stocker mes objets, puis de parcourir le tableau pour supprimer les références ou gérer les displaylists, ça m'évites à parcourir mes displaylists pour gérer mes objets, peu importe où l'objet est affiché, sa référence est dans le tableau. Il en va de même pour les supprimer.

Un exemple simple :


var unclip:MovieClip();
var stock:Array = [];

for(var i:int; i<10; i++){
        unclip = new MovieClip();
        stock.push(unclip);
        addChild(unclip);
}

// puis plus tard
while(this.numChildren) this.removeChildAt(0);
stock = [];
unclip = null;
 

Une seule variable temporaire (unclip) pour générer tous mes objets.
Tous les objets sont placés dans un tableau et affiché dans un conteneur.
Pour détruire tous les objets je les retires de l'affichage (plus d'objets affichés).
Puis je vide le tableau (plus aucun objet n'existe).
Et je m'assure enfin que la petite variable temporaire est bien vidée (null).

#10 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 259 messages

Posté 07 July 2017 - 10:38 AM

Bon,

J'utilise pas trop le push mais vais m'y mettre !

Dernière question puis je vous embête plus...

Il est ou le problème ici ? Quelle est cette affectation dont on me fait part ???


while (this.numChildren > 0) {

  this.removeChildAt(this.numChildren - 1);
  getChildAt(this.numChildren-1 )= null; /// POURQUOI CA MARCHE PAS ...

}
 


#11 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1747 messages

Posté 07 July 2017 - 11:39 AM

parce que tu l'as retiré de la liste d'affichage


while (this.numChildren > 0) {
  var clip:MovieClip = getChildAt( this.numChildren -1 );
  this.removeChild( clip );
  clip = null; /// POURQUOI CA MARCHE PAS ...
}
 


#12 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 259 messages

Posté 07 July 2017 - 15:58 PM

PÔl !A

Après ou avant c'est du pareil au même.
Désormais mon code d'erreur ( avec ton exemple est le suivant :

Séquence 1, Calque 'Action générale', Image 4, ligne 164, colonne 25 1118 : Contrainte implicite d'une valeur du type statique flash.display:DisplayObject vers un type peut-être sans rapport flash.display:MovieClip.

Snif...

#13 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1747 messages

Posté 07 July 2017 - 16:12 PM

2 solutions

var clip:DisplayObject = getChildAt( this.numChildren -1 );
 
ou

var clip:MovieClip = getChildAt( this.numChildren -1 ) as MovieClip;
 





Répondre à ce sujet



  

1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP