Problème de loader / unload [Résolu]

cs_olliesound 41 Messages postés lundi 22 décembre 2008Date d'inscription 16 décembre 2009 Dernière intervention - 27 avril 2009 à 16:56 - Dernière réponse : cs_olliesound 41 Messages postés lundi 22 décembre 2008Date d'inscription 16 décembre 2009 Dernière intervention
- 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?
Afficher la suite 

Votre réponse

43 réponses

Meilleure réponse
Blacknight91titi 1754 Messages postés jeudi 17 juin 2004Date d'inscription 9 mars 2015 Dernière intervention - 30 avril 2009 à 19:17
3
Merci
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é.

Merci Blacknight91titi 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de Blacknight91titi
on_drag_on 1275 Messages postés vendredi 13 mai 2005Date d'inscription 6 octobre 2010 Dernière intervention - 27 avril 2009 à 17:30
0
Merci
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
Commenter la réponse de on_drag_on
cs_olliesound 41 Messages postés lundi 22 décembre 2008Date d'inscription 16 décembre 2009 Dernière intervention - 27 avril 2009 à 17:38
0
Merci
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 !
Commenter la réponse de cs_olliesound
cs_olliesound 41 Messages postés lundi 22 décembre 2008Date d'inscription 16 décembre 2009 Dernière intervention - 27 avril 2009 à 18:22
0
Merci
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
Commenter la réponse de cs_olliesound
Blacknight91titi 1754 Messages postés jeudi 17 juin 2004Date d'inscription 9 mars 2015 Dernière intervention - 28 avril 2009 à 09:34
0
Merci
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
Commenter la réponse de Blacknight91titi
cs_olliesound 41 Messages postés lundi 22 décembre 2008Date d'inscription 16 décembre 2009 Dernière intervention - 28 avril 2009 à 09:52
0
Merci
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);
Commenter la réponse de cs_olliesound
cs_Girou 1204 Messages postés lundi 10 mars 2003Date d'inscription 23 juillet 2009 Dernière intervention - 28 avril 2009 à 11:21
0
Merci
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();
}

@+
Commenter la réponse de cs_Girou
Blacknight91titi 1754 Messages postés jeudi 17 juin 2004Date d'inscription 9 mars 2015 Dernière intervention - 28 avril 2009 à 11:56
0
Merci
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);
Commenter la réponse de Blacknight91titi
cs_olliesound 41 Messages postés lundi 22 décembre 2008Date d'inscription 16 décembre 2009 Dernière intervention - 28 avril 2009 à 12:01
0
Merci
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.
Commenter la réponse de cs_olliesound
Blacknight91titi 1754 Messages postés jeudi 17 juin 2004Date d'inscription 9 mars 2015 Dernière intervention - 28 avril 2009 à 12:09
0
Merci
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à.
Commenter la réponse de Blacknight91titi
cs_olliesound 41 Messages postés lundi 22 décembre 2008Date d'inscription 16 décembre 2009 Dernière intervention - 28 avril 2009 à 12:16
0
Merci
Hélas aucune de ces classes....
Commenter la réponse de cs_olliesound
cs_Girou 1204 Messages postés lundi 10 mars 2003Date d'inscription 23 juillet 2009 Dernière intervention - 28 avril 2009 à 12:21
0
Merci
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.

@+
Commenter la réponse de cs_Girou
cs_olliesound 41 Messages postés lundi 22 décembre 2008Date d'inscription 16 décembre 2009 Dernière intervention - 28 avril 2009 à 12:42
0
Merci
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.
Commenter la réponse de cs_olliesound
cs_olliesound 41 Messages postés lundi 22 décembre 2008Date d'inscription 16 décembre 2009 Dernière intervention - 28 avril 2009 à 12:43
0
Merci
Comment puis je joindre les swf à mon message?? un exemple parlera mieux que l'ecrit
Commenter la réponse de cs_olliesound
Blacknight91titi 1754 Messages postés jeudi 17 juin 2004Date d'inscription 9 mars 2015 Dernière intervention - 28 avril 2009 à 12:51
0
Merci
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.
Commenter la réponse de Blacknight91titi
cs_olliesound 41 Messages postés lundi 22 décembre 2008Date d'inscription 16 décembre 2009 Dernière intervention - 28 avril 2009 à 12:57
0
Merci
Tu as surement raison mais alors comment spécifier un retour au swf principal dans mes swf externes?
?
Commenter la réponse de cs_olliesound
Blacknight91titi 1754 Messages postés jeudi 17 juin 2004Date d'inscription 9 mars 2015 Dernière intervention - 28 avril 2009 à 13:01
0
Merci
Via les évènements ;)
Commenter la réponse de Blacknight91titi
cs_olliesound 41 Messages postés lundi 22 décembre 2008Date d'inscription 16 décembre 2009 Dernière intervention - 28 avril 2009 à 13:08
0
Merci
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);
Commenter la réponse de cs_olliesound
cs_Girou 1204 Messages postés lundi 10 mars 2003Date d'inscription 23 juillet 2009 Dernière intervention - 28 avril 2009 à 13:20
0
Merci
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.

@+
Commenter la réponse de cs_Girou
cs_olliesound 41 Messages postés lundi 22 décembre 2008Date d'inscription 16 décembre 2009 Dernière intervention - 28 avril 2009 à 13:30
0
Merci
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 ?
Commenter la réponse de cs_olliesound

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.