Problème de loader / unload

Résolu
cs_olliesound Messages postés 41 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 16 décembre 2009 - 27 avril 2009 à 16:56
cs_olliesound Messages postés 41 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 16 décembre 2009 - 1 mai 2009 à 09:25
Salut tout le monde je vous expose mon souci :

Réalisant mon portfolio en flash, j'ai créé un swf principal avec des boutons qui lorsque l'on clique sur eux appellent des swf externes. Tout marche formidablement bien hormis une chose: le unload tant et si bien qu'au bout d'un moment l'anim rame complètement puisque les swf se superposent. J'ai retourné le problème dans tous les sens et pourtant bien cherché mais rien à faire je n'arrive pas à régler mon prob.

Ci joint le code de mon swf d'accueil:

var chargeur:Loader = new Loader();
var adresse:URLRequest = new URLRequest("the wall reverse.swf");
var adresse2:URLRequest = new URLRequest("the wall reverse 2.swf");
var adresse3:URLRequest = new URLRequest("the wall reverse 3.swf");
addChild(chargeur);



function fct1(pEvt:MouseEvent):void {

chargeur.load(adresse);
}

function fct2(pEvt:MouseEvent):void {

chargeur.load(adresse2);
}

function fct3(pEvt:MouseEvent):void {

chargeur.load(adresse3);
}

bouton1.addEventListener(MouseEvent.CLICK,fct1);
bouton2.addEventListener(MouseEvent.CLICK,fct2);
bouton3.addEventListener(MouseEvent.CLICK,fct3);



J'ai essayé de mettre des "chargeur.unload();" avant les "load", mes "trace" passent bien et pourtant rien de se décharge"...

Une idée?

43 réponses

Blacknight91titi Messages postés 1732 Date d'inscription jeudi 17 juin 2004 Statut Membre Dernière intervention 9 mars 2015 2
30 avril 2009 à 19:17
Il me semble (pas sûr) qu'il faille activer le double click sur le parent.

Renseigne toi sur cet évènement dans le dictionnaire, la démarche est expliqué.
3
on_drag_on Messages postés 1236 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 6 octobre 2010
27 avril 2009 à 17:30
Salut,


C'est étrange ... ça ne viendrait-il pas de tes swfs externes ou il y a
peut-être une boucle infinie ou que sais-je ...  par hasard ? Parce que
si tu fais :


chargeur.unload();


chargeur.load(adresse);


Ca doit fonctionner ....

@+.
telov.ch
0
cs_olliesound Messages postés 41 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 16 décembre 2009
27 avril 2009 à 17:38
Je vais jeter un coup d'oeil mais tout comme toi je suis surpris que ça ne passe pas ... Du coup je vais mettre un "unload();" au dessus de chaque load.... je réessaye pour voir !
0
cs_olliesound Messages postés 41 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 16 décembre 2009
27 avril 2009 à 18:22
N'y a t il pas un rapport avec la scène principale ? Dans le sens ou la chargeur agit depuis la scene principale et non pas dans un movieclip ? Auquel cas je devrais décharger dans la scène.... si quelqu'un à la syntaxe AS3 parce que les root et stage, il a pas l'air d'aimer mon code... Merci d'avance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Blacknight91titi Messages postés 1732 Date d'inscription jeudi 17 juin 2004 Statut Membre Dernière intervention 9 mars 2015 2
28 avril 2009 à 09:34
Bonjour,

La cible ici n'a pas beaucoup d'importance étant donné que tu agis sur le même niveau.
addChild() ajoute ton DisplayObject sur l'élément en cours.

C'est en effet cependant très étonnant de constater ce problème... Est le code exact que tu as mis dans ton message ?
Le problème peut également venir d'ailleurs.

Est ce que sur le swf que tu charge, il n'y aurait pas un "stage.addChild(...)" qui ferait que celui-ci sort de son contexte.

Note : Peut-être faut t'il d'abord retirer le loader de la scène avant de le décharger puis de le remettre (histoire de rafraîchir le visuel).

Blacknight
www.osteres.com
0
cs_olliesound Messages postés 41 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 16 décembre 2009
28 avril 2009 à 09:52
voila le code un peu remanié qui se trouve sur le swf qui se lance en guise d'accueil.

J'ai mis un calque avec un son qui se lit en boucle histoire de voir si, quand je clique sur bt1, bt2 ou bt3 le loader se décharge bien... a priori non ...........

le code :

var chargeur:Loader = new Loader();

var adresse:URLRequest = new URLRequest("thewallreverse.swf");

var adresse2:URLRequest = new URLRequest("thewallreverse2.swf");

var adresse3:URLRequest = new URLRequest("thewallreverse3.swf");

addChild(chargeur);

function fct1(pEvt:MouseEvent):void {
   
    chargeur.unload();

    removeChild(chargeur);

    chargeur.load(adresse);

    addChild(chargeur);

}

function fct2(pEvt:MouseEvent):void {
   
    chargeur.unload();

    removeChild(chargeur);

    chargeur.load(adresse2);

    addChild(chargeur);

}

function fct3(pEvt:MouseEvent):void {
   
    chargeur.unload();

    removeChild(chargeur);

    chargeur.load(adresse3);

    addChild(chargeur);

}

bouton1.addEventListener(MouseEvent.CLICK,fct1);

bouton2.addEventListener(MouseEvent.CLICK,fct2);

bouton3.addEventListener(MouseEvent.CLICK,fct3);
0
cs_Girou Messages postés 1203 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 23 juillet 2009 2
28 avril 2009 à 11:21
Bonjour,

j'aurais tendance a dire que le probleme doit venir des swf externes comme le signalent On_drag_on et Blacknight91titi

unload() va retirer le swf chargé de la displayList du Loader mais pas l'enlever de la mémoire.
Hors si effectivement il y a des écouteurs ou des références placées hors du contexte du swf chargé, il restera toujours en mémoire.
si on recharge plusieurs fois le même swf, j'ai tendance a penser que dans la mémoire du swf principale, chaque swf chargé sera considéré comme une entité indépendante et donc la mémoire risque de saturer à un moment.

dans la doc de Flash on trouve ceci :

unload, (), method,  
 public function unload():void
Language Version : , ActionScript 3.0
Runtime Versions : , AIR 1.0, Flash Player 9

Removes a child of this Loader object that was loaded by using the
load()
method.
The
property
of the associated LoaderInfo object is reset to
null
.
The child is not necessarily destroyed because other objects might have references to it; however,
it is no longer a child of the Loader object.


As a best practice, before you unload a child SWF file, you should explicitly
close any streams in the child SWF file's objects, such as LocalConnection, NetConnection,
NetStream, and Sound objects. Otherwise, audio in the child SWF file might continue to play, even
though the child SWF file was unloaded. To close streams in the child SWF file, add an event listener
to the child that listens for the
unload
event. When the parent calls
Loader.unload()
, the
unload
event is dispatched to the child.
The following code shows how you might do this:

function closeAllStreams(evt:Event) {
myNetStream.close();
mySound.close();
myNetConnection.close();
myLocalConnection.close();
}

@+
0
Blacknight91titi Messages postés 1732 Date d'inscription jeudi 17 juin 2004 Statut Membre Dernière intervention 9 mars 2015 2
28 avril 2009 à 11:56
L'idée est bonne, dans un premier temps essai de ne travailler qu'avec deux swf. Tu auras moins de boulot pour trouver ce qui ne vas pas.

En suite, peux-tu nous montrer l'un des swf que tu charges ? A condition que tu es centré ton code au même endroit :)

Travail l'idée de la référence vers le swf qui n'est pas perdue.


Une petite traduction pour ceux ne comprenant pas ;)

unload () méthode
public function unload():void
Version du langage: ActionScript 3.0
Versions du moteur d'exécution: AIR 1.0 Flash Player 9
Supprime un enfant de l'objet Loader chargé à l'aide de la méthode load(). La valeur property de la propriété null de l'objet LoaderInfo associé est réinitialisée. L'enfant n'est pas nécessairement détruit, car d'autres objets risquent de s'y référer. Il n'est cependant plus un enfant de l'objet Loader.

Avant de décharger un fichier SWF enfant, il est recommandé de fermer explicitement tout flux continu dans les objets enfants du fichier SWF, tels que les objets LocalConnection, NetConnection, NetStream et Sound. Si vous n'effectuez pas cette opération, la lecture de l'audio risque de continuer dans le fichier SWF enfant, bien que ce dernier soit déchargé. Pour fermer les flux continus dans le fichier SWF enfant, ajoutez un écouteur d'événement à l'enfant qui écoute l'événement unload. Lorsque le parent appelle Loader.unload(), l'événement unload est distribué à l'enfant. L'exemple suivant illustre cette opération :

function closeAllStreams(evt:Event) {
myNetStream.close();
mySound.close();
myNetConnection.close();
myLocalConnection.close();
}

myMovieClip.loaderInfo.addEventListener(Event.UNLOAD, closeAllStreams);
0
cs_olliesound Messages postés 41 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 16 décembre 2009
28 avril 2009 à 12:01
J'essaye ça tout de suite !!! effectivement j'ai lu cela ce matin et il semblerait que contrairement à loadMovie(); et unloadMovie(); qui supprimait automatiquement le loadMovie chargé précédemment, le Load et Unload d'as3 est beaucoup plus difficile à gérer....

le lien : http://www.astorm.ch/blog/index.php?post/2008/04/16/Polemique-envers-Loaderunload

j'ai pas très bien compris les removeListener, ou du moins ça n'a rien apporté à mon code.
0
Blacknight91titi Messages postés 1732 Date d'inscription jeudi 17 juin 2004 Statut Membre Dernière intervention 9 mars 2015 2
28 avril 2009 à 12:09
Ce n'est pas forcément plus difficile à gérer, c'est juste qu'il faut être plus rigoureux quand tu développes et penser à plus de chose plutôt que de laisser faire la machine.

La logique est simple : Plus la machine fera de boulot à ta place, moins elle sera performante ;)
ActionScript 3 apporte une énorme amélioration au niveau performance, mais en contrepartie la conception se doit d'être mieux réalisé.

Il faut voir le bon coté : Cela oblige à mieux concevoir.

Ceci-dit...le coup du unload dans un swf, je pense que très peu de gens y pense (moi y compris).
Tout dépend en fait l'utilisation de tes swf ;) (J'ai tendance à ne jamais inclure d'autre swf personnellement, je n'aime pas ça).

Dans tes swf inclus, tu utilises l'une des classes suivantes ?
- LocalConnection
- NetConnection
- NetStream
- Sound

S'il y en a au moins une, le problème peut très certainement se trouver là.
0
cs_olliesound Messages postés 41 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 16 décembre 2009
28 avril 2009 à 12:16
Hélas aucune de ces classes....
0
cs_Girou Messages postés 1203 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 23 juillet 2009 2
28 avril 2009 à 12:21
Au vu de l'article que tu as posté en lien, un Event.ENTERFRAME suffit a garder le swf en mémoire. Hors, celui-là je serais étonné qu'il n'y en ai pas.

@+
0
cs_olliesound Messages postés 41 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 16 décembre 2009
28 avril 2009 à 12:42
Les seuls event sont des MouseEvent.CLICK....

Je vais essayer de mieux expliquer mon code :

le SWF qui se lance en accueil contient trois boutons qui chargent chacun un swf externe.

Dans chacun de ces swf, la fonction load est utilisée pour charger les images du portfolio et un bouton retour charge un autre swf externe (commun au trois boutons du swf principal) qui reprend la partie "choix d'une catégorie" de mon swf principal (cela permet de ne pas se retaper l'anim complete du début) et qui donc reprend les 3 boutons du swf principal qui chargent leur swf externe propre.

Ce qui fait un total de 5 swf : le principal / les 3 boutons / le menu .

Et ce qui se passe c'est que quand je lance l'anim tout va bien jusqu'à grosso merdo la 4 ème interaction de ma souris ou l'anim rame de plus en plus.
0
cs_olliesound Messages postés 41 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 16 décembre 2009
28 avril 2009 à 12:43
Comment puis je joindre les swf à mon message?? un exemple parlera mieux que l'ecrit
0
Blacknight91titi Messages postés 1732 Date d'inscription jeudi 17 juin 2004 Statut Membre Dernière intervention 9 mars 2015 2
28 avril 2009 à 12:51
Citation :
"et un bouton retour charge un autre swf externe"

Si j'ai bien compris ce que tu as voulut dire, c'est peut être la que cela coince.
Tu utilises un bouton à l'intérieur d'un swf chargé pour charger un autre swf à l'intérieur de ce swf (ca fait beaucoup de swf tout ça...) ?

Note : On ne peut pas joindre de fichier aux messages sur flashkod.
0
cs_olliesound Messages postés 41 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 16 décembre 2009
28 avril 2009 à 12:57
Tu as surement raison mais alors comment spécifier un retour au swf principal dans mes swf externes?
?
0
Blacknight91titi Messages postés 1732 Date d'inscription jeudi 17 juin 2004 Statut Membre Dernière intervention 9 mars 2015 2
28 avril 2009 à 13:01
Via les évènements ;)
0
cs_olliesound Messages postés 41 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 16 décembre 2009
28 avril 2009 à 13:08
C'est a dire ? concrètement voila le code du principal :

var chargeur:Loader = new Loader();
var adresse:URLRequest = new URLRequest("thewallreverse.swf");
var adresse2:URLRequest = new URLRequest("thewallreverse2.swf");
var adresse3:URLRequest = new URLRequest("thewallreverse3.swf");
addChild(chargeur);

function fct1(pEvt:MouseEvent):void {
   
    chargeur.load(adresse);
    chargeur.unload();
}

function fct2(pEvt:MouseEvent):void {
   
    chargeur.load(adresse2);
    chargeur.unload();
}

function fct3(pEvt:MouseEvent):void {
   
    chargeur.load(adresse3);
    chargeur.unload();
}

bouton1.addEventListener(MouseEvent.CLICK,fct1);
bouton2.addEventListener(MouseEvent.CLICK,fct2);
bouton3.addEventListener(MouseEvent.CLICK,fct3);

et le code d'un des swf externe :

var chargeur:Loader = new Loader();
var adresse:URLRequest = new URLRequest("photos/cafetiere.png");
var adresse1:URLRequest = new URLRequest("photos/inacheves.png");
var adresse2:URLRequest = new URLRequest("photos/bmw.png");
var adresse3:URLRequest = new URLRequest("photos/lotus.png");
var adresse4:URLRequest = new URLRequest("photos/ford.png");
var adresse5:URLRequest = new URLRequest("thewall.swf");
var Xpos:Number = 180;
var Ypos:Number = 30;
chargeur.x=Xpos;
chargeur.y=Ypos;
addChild(chargeur);

function fct1(pEvt:MouseEvent):void {
   
    chargeur.unload();
    chargeur.load(adresse);
}

function fct2(pEvt:MouseEvent):void {
   
    chargeur.unload();
    chargeur.load(adresse1);
}

function fct3(pEvt:MouseEvent):void {
   
    chargeur.unload();
    chargeur.load(adresse2);
}

function fct4(pEvt:MouseEvent):void {

    chargeur.unload();
    chargeur.load(adresse3);
}

function fct5(pEvt:MouseEvent):void {
   
    chargeur.unload();
    chargeur.load(adresse4);
}

function fct6(pEvt:MouseEvent):void {
   
    chargeur.unload();
    chargeur.load(adresse5);
    chargeur.x=0;
    chargeur.y=0;
}

bouton1.addEventListener(MouseEvent.CLICK,fct1);
bouton2.addEventListener(MouseEvent.CLICK,fct2);
bouton3.addEventListener(MouseEvent.CLICK,fct3);
bouton4.addEventListener(MouseEvent.CLICK,fct4);
bouton5.addEventListener(MouseEvent.CLICK,fct5);
thewall.addEventListener(MouseEvent.CLICK,fct6);
0
cs_Girou Messages postés 1203 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 23 juillet 2009 2
28 avril 2009 à 13:20
Oufti

je suppose que thewall.swf est (aussi) ton animation principale ?

Avec ton systeme tu imbriques au fur et a mesure les swf les un dans les autres...
Tu ferais mieux d'avoir ton menu principale dans ton swf principale et de piloter tes autres swf (portfolios) depuis ton menu.

Et au vu du code de tes swf 'secondaires' tu aurais même avantage a tous regrouper dans un unique swf. je ne vois pas l'avantage de tout morceler.

@+
0
cs_olliesound Messages postés 41 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 16 décembre 2009
28 avril 2009 à 13:30
Le problème c'est que je ne vois absolument pas comment faire ....... à part en mettant tout l'animation dans un seul et même fla auquel cas ça fait peser lourd...............

Pourrais tu m'éclairer sur la marche à suivre ?
0
Rejoignez-nous