Forums Développement Multimédia

Aller au contenu

- - - - -

Gérer les ressources sous Flash pour plus d'efficacité. Pb d'optimisation.

as3 flash

11 réponses à ce sujet

#1 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 259 messages

Posté 15 December 2014 - 09:56 AM

Bonjour !

Des fois ça roule tout seul.
Des fois ça rame.

Mes questions sont donc les suivantes et à mon sens assez basiques :

1. Concernant le code et travaillant sur la timeline.

Faut-il systématiquement fermer tout écouteur lorsque l'on change de frame et pour peu bien sur que l'on ai plus besoin d'écouter ?
ex.
en Frame 1 : des boutons et enterFrame.
En frame 2 il n'y a ni code ni boutons.
Que ce passe t'il en 2 ? Les écouteurs de la 1 sont-ils toujours actifs même si absents du code ???

2. Concernant l'image et la vidéo.

Faut-il privilégier le vectoriel ou le jpg ? le jpg ou le png ?
Faut-il privilégier une petite vidéo de fumée ou un générateur de particule ?
En gros : faut-il privilégier la mémoire vive ou le calcul....

Merci !

#2 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 654 messages

Posté 15 December 2014 - 16:12 PM

Desole, je ne sais pas comment cela fonctionne sur la timeline, mais mon petit doigt me dit que si tu ne nettoie pas manuellement tes ecouteurs, alors ils resteront actifs tant que ca ne sera pas fait. Mais je m'avance peut-etre trop, et aussi bien le garbage collector supprime toutes les references d'une frame a l'autre.

Concernant ta seconde question, bhe il n'y a pas de bonne reponse ! Tout depends de ce que tu veux faire et de la plateforme cible ! C'est a toi de consulter les caracteristiques de la plateforme que tu vise pour savoir quel est son point fort, et cela depends aussi de ton application. Si tu as des animations longues et complexes, peut-etre que ca sera mieu de faire du vectoriel, parceque transposer la meme animation en sprite sheets serait trop couteuse en memoire, et vice versa.

#3 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 259 messages

Posté 30 December 2014 - 12:09 PM

Bon....

A chercher on fini par trouver. Mais pas tout.

Privilégier le JPEG au PNG si possible.
Les images disparaissent de la mémoire d'une frame à l'autre.
Ca me tranquillise...
Pratique d'Action script 3 dans wiki traite entre autre de mon problème de façon très complète.

Je commence à comprendre l'histoire du ramasse miette mais pour faire les choses correctement il faut effacer manuellement.
J'efface des écouteurs, j'affecte des null pour plus de sécurité... Bref... J'essaie de faire ça avec vigilance.

2 Problèmes demeurent :

1. Les fonctions de s'effacent pas d'une frame à l'autre. Faut-il les effacer et comment ???

2. Ceux qui liront vont peut-être se moquer :


function Bougemenu1(xParam: int): void {

//// J'écoute mon clip MenuProduits pour le faire glisser.
MenuProduits.addEventListener(TouchEvent.TOUCH_BEGIN, F_menu1a);
MenuProduits.addEventListener(TouchEvent.TOUCH_END, F_menu1b);

//// Je donne les nouveaux paramètres de dimension du menu.
var dimProd: Rectangle = new Rectangle(270, 270, 0, (-1 * (xParam - 1) * 540));

//// Première fonction imbriquée pour que ça bouge
function F_menu1a(event: TouchEvent): void {
  event.target.startTouchDrag(event.touchPointID, false, dimProd);
}

//// Deuxième fonction imbriquée pour que ça s'arrête correctement et plus...
function F_menu1b(event: TouchEvent): void {
  event.target.stopTouchDrag(event.touchPointID);
  selectionMenu = (int((MenuProduits.y / -548) + 2));
  MiseajourM1();
}

}
 

Il s'agit d'un menu " glissant" qui à besoin de paramètres ( sa longueur : nombre de produits )
Du coup : il y a des fonction imbriqués. Je sais : c'est pas terrible.

Alors, comment enlever les écouteurs imbriqués dans ma fonction ???

Ptêt bien que le problème est ailleurs... A scripter avec les pieds je passe peut-être à coté d'évidences...

Bref, si une bonne âme est de passage...

#4 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 259 messages

Posté 30 December 2014 - 12:42 PM

Bon...

http://forums.mediab...deventlistener/

Mais les liens sont morts depuis.
Mais ça doit-être un début de solution...
Trouver la classe adéquat.

#5 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 259 messages

Posté 30 December 2014 - 13:33 PM

Bon.

C'était une mauvaise piste. Je crois.
Sur ce coup là c'est bon.


var dimProd: Rectangle = new Rectangle(270, 270, 0, 0);

function Bougemenu1(xParam: int): void {
dimProd.bottom = (-1 * (xParam ) * 540);
}
 

Pas de fonctions imbriquées. ouf.

Ca se complique ensuite.
Toujours ce besoin de faire passer des variables dans des listener pour des Drag...

Mais du coup c'est ptêt un autre sujet.

Pfff....

#6 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 30 December 2014 - 13:42 PM

Hello,

De ce que je lis en diagonale (je peux me tromper) tu essayes de mélanger timeline et code, or ce procédé à rapidement des limites.
Pour bien faire il faut séparer graphismes et code et commencer à réfléchir à ton programme dans son ensemble.
Considère les graphismes comme des Assets que tu manipule via le code, sers toi de la timeline pour créer des objets que tu maipule ensuite de manière plus globale avec ton code (afficher un objet et le positionner quand on en a besoin, le supprimer et supprimer ses écouteurs, etc...) en s'affranchissant de la notion (certes bien pratique) de temps linéaire donné par la timeline.

#7 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 259 messages

Posté 30 December 2014 - 14:24 PM

Salut M. SPI !

J'crois que je travaille sous Flash CC comme avec Flash MX 2004.
Et la en effet : il y a gourance.

Je dois livrer un programme le 7 Janvier et je rame dur !

Comme disait Didier : lâcher prise.
C'est ptet par là que va passer l'optimisation.
Tout est Objet. Faut que ça rentre dans la tête !

Et après : je fais des miracles !

#8 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 30 December 2014 - 15:27 PM

Voir le messagearchiroc, le 30 December 2014 - 12:09 PM, dit :

Il s'agit d'un menu " glissant" qui à besoin de paramètres ( sa longueur : nombre de produits )
Du coup : il y a des fonction imbriqués. Je sais : c'est pas terrible.
Je dirais non (et bien sûr re-non).
Non : le menu, même s'il s'agit d'une savonnette, n'a pas besoin de paramètres, mais sûrement plus d'une propriété
Re-non : Le "Du coup" est en trop. Ce n'est pas la faute de la savonnette… Juste de ton approche.

Si tu as un délais à tenir, je te donnes prêtes* une solution temporaire :
il existe un type d'objet qui ressemble beaucoup au tableaux. Ce sont les dictionaries.
La différences : au lieu de toujours utiliser, comme clé d'entré, les indices numériques 0,1,2,3,4,5… on peut utiliser n'importe quel objet.
Du coup, avec un dictionary, on peut créer une association durable entre un objet et un autre, afin de retrouver l'info plus tard.
Ça fonctionne comme ceci :

var dico:Dictionary=new Dictionary(); // Initialisation
dico[menu_machin]=truc; // Association d'un truc à l'objet menu_machin

trace(dico[menu_machin]); // retrouve la valeur du truc

Ceci devrait te permette de stocker tes rectangles de drag (ou tout simplement ton xParam, pourquoi pas) puis de les retrouver dans tes fonctions associées aux événements.
Comme ceci (code non testé) :

// Variable déclarée en dehors des fonctions, elle sera accessible par toutes les fonctions
var rectangles:Dictionary=new Dictionary();


function Bougemenu1 (xParam: int):void
{
  //// J'écoute mon clip MenuProduits pour le faire glisser.
  MenuProduits.addEventListener (TouchEvent.TOUCH_BEGIN, F_menu1a);
  MenuProduits.addEventListener (TouchEvent.TOUCH_END, F_menu1b);
  //// Je stocke le rectangle du futur drag dans le dictionnaire
  rectangles[MenuProduits]=new Rectangle(270, 270, 0, (-1 * (xParam - 1) * 540));
}

function F_menu1a (event: TouchEvent):void
{
// je récupère le rectangle du drag. Pour cela, je n'ai pas besoin de savoir quel objet à été cliqué
// je demande juste au dictionnaire de me renvoyer le rectangle associé à l'[objet cliqué]
  var rect:Rectangle=rectangles[event.target];
  event.target.startTouchDrag (event.touchPointID, false, rect);
}

function F_menu1b (event: TouchEvent):void
{
  event.target.stopTouchDrag (event.touchPointID);
  selectionMenu = (int((MenuProduits.y / -548) + 2));
  MiseajourM1 ();
}
 


// Sinon, oui, je trouve que tu ne lâches pas encore assez prise : des noms de fonction comme F_menu1a et F_menu1b sont de mauvaise augure :-)
Je préfèrerais voir une structure dans laquelle tes rectangles seraient fournis par les objets cible, via des propriétés. Et des fonctions génériques à tous les menus. Sans pousser trop loin, ça se présenterait plutôt comme ceci (ce code fait sans doute n'importe quoi, mais il le fait pour 4 menu… parce que les fonctions sont conçues pour agir sans qu'elles sachent quel menu elles traitent.


// des propriétés dans les objets menus :
menuProduits.rect=new Rect (0,0,200,200);
menuServices.rect=new Rect (0,0,200,200);
menuSuivant.rect=new Rect (0,0,200,200);
menuFinal.rect=new Rect (0,0,200,200);

bougeMenu(menuProduits,1);
bougeMenu(menuServices,2);
bougeMenu(menuSuivant,3);
bougeMenu(menuFinal,4);

function bougeMenu(un_menu:MovieClip,un_param:int):void {
  un_menu.rect.x=un_param*200);
  un_menu.addEventListener(TouchEvent.TOUCH_BEGIN, touch_begin);
  un_menu.addEventListener(TouchEvent.TOUCH_END, touch_end);
}

function touch_begin(event: TouchEvent): void {
  event.target.startTouchDrag(event.touchPointID, false, event.target.rect);
}

function touch_end(event: TouchEvent): void {
  event.target.stopTouchDrag(event.touchPointID);
  event.target.selectionMenu =(?)
}
 


* Oui, je te la prêtes, avec obligation de la rendre sous peine de pénalités. Ceci afin que tu ne t'habitues pas trop à ces pratiques un peu moyennes. J'attends mieux de toi, petit scarabée.

#9 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 259 messages

Posté 30 December 2014 - 19:46 PM

Ce qui est GENIAL c'est le partage de connaissance.

Je commence à comprendre qu'il faut faire corps avec le code.
Certes, ça devient transcendantal mais c'est ce que j'ai réalisé en jouant au tennis et en essayant de faire corps avec la balle pour retrouver mon service d'antan.

un truc genre :
« La perfection est atteinte, non pas quand il n'y a plus rien à ajouter, mais quand il n'y a plus rien à enlever »
Antoine de Saint-Exupéry

Bref. MERCI mille fois.
Je suis / j'étais Architecte. Un conseil ? N'hésitez pas !
Un problème en AS3 ? N'hésitez pas ! Heuh.... Si... Pour l'instant...

:D

#10 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 259 messages

Posté 02 January 2015 - 11:24 AM

Bonjour les gens !

Bonne année à tous, vivez de profonds orgasmes et mettez à la poubelle toutes les bonnes résolutions qui ne tiendront pas plus de 2 jours !

Bon, au boulot,

Didler, le sujet de ce post c'est bien gérer et optimiser.

Je lis ton code, je comprends, c'est fluide et simple.

Mais :

Nous avons des écouteurs dans la fonction BougeMenu.
( un_menu.addEventListener(TouchEvent.TOUCH_BEGIN, touch_begin); )

Ces écouteurs peuvent-ils être effacés ?

Faut-il qu'ils le soit ?

Ou, vogue le navire, l'animation continue, je passe en frame 2 et laisse flash gérer les écouteurs paumés en frame 1 ?

A l'occas' si toi même ou un autre sachant passes dans le coin...
Merci.

#11 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 02 January 2015 - 13:56 PM

Hello. Là, l'écouteur est posé par le parent. Donc, l'écouteur ne sera supprime automatiquement que lorsque le ramassemiette videra le parent. Quand on utilise le scénario, cela se produira si le parent disparait de la scène et n'est pas référencé par un autre objet. Pour avoir une gestion automatique plus efficace il vaudrait mieux utiliser des classes qui s' écoutent elles mêmes et discutent avec les autres éléments avec des events.

Mais sinon un écouteur n'est pas le plus gourmand en ressources, le seul souci serait que la fonction associée á l'écouteur soit lancée et plante par absence d'un objet.

Enlever tous les écouteurs serait possible et propre (mais quand même un tantinet maniaque et complexe) et l'on en revient au début de la discussion (ou d'une autre) : Poser tous les éléments interactifs dans un seul conteneur permettrait de n'avoir qu'un seul écouteur et donc, de pouvoir le retirer beaucoup plus facilement.

#12 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 259 messages

Posté 02 January 2015 - 14:23 PM

Merci !

Bien compris.

En réalité je n'utilise la Timeline que sur 4 frames.
1. Page de menu général
2. Page de menus déroulants
3. Le gros du programme
4. Photos de réalisations.

Alors ça devrait le faire !
Ma seule crainte était qu'en laissant un écouteur en place cela plante l'application.

Donc ça devrait le faire.
Puis dans quelques jours je fonce POO et classes !

A++



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

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