2011-07-08 3 views
0

Je fais une présentation sur laquelle j'ai besoin d'utiliser beaucoup de clips vidéo. Je charge toutes ces vidéos dynamiquement en utilisant Loader. J'utilise un extrait de code comme ceci:décharger swf chargé dynamiquement après l'avoir affiché AS3

var req:URLRequest = new URLRequest("video.swf"); 
var a:Loader = new Loader(); 
a.load(req); 
stage.addChild(a); 

un Maintenant, la question est: Quand je reçois à-dire le 7 un, il commence à la traîne. Je ne sais pas pourquoi, mais je pense que c'est parce que tout est chargé en mémoire. Est-il possible d'effacer une vidéo de la mémoire après l'avoir affichée? Ou y a-t-il une autre solution à cela?

+0

Que faites-vous lorsque chacun d'eux se termine, nettoyez-vous ensuite? – shanethehat

+0

Vous venez de me battre à elle! 'removeChild' est la première étape de ce problème :) –

Répondre

0

Je pense avoir trouvé la solution. Si vous utilisez removeChild, il arrête seulement d'afficher, mais le tout est toujours en mémoire (cache). Ainsi, plus vous chargez les vidéos, plus vous remplissez le cache. Nous avons besoin de quelque chose qui efface complètement le cache avant de charger une autre vidéo.

J'ai utilisé unloadAndStop() et il semble avoir complètement fait l'affaire, sauf si quelqu'un a quelque chose contre.

Merci encore

1

Si vous chargez simplement une nouvelle vidéo à chaque fois et que vous l'ajoutez à la scène, vous aurez une assez grande hiérarchie de films superposés; tous gardés sur scène et en mémoire.

Si vous conservez une référence au film précédemment chargé, vous pouvez simplement le supprimer de la scène lorsque le film 'suivant' est chargé. N'a pas testé cela correctement, mais juste pour vous donner une idée de ce que le code pourrait ressembler:

var oldLoader:Loader = null; 

var a:Loader = new Loader(); 
a.contentLoaderInfo.addEventListener(Event.COMPLETE, loader_complete); 
a.load(<your url>); 

function loader_complete(e:Event):void { 
    var newLoader:Loader = e.currentTarget.loader as Loader; 

    stage.addChild(newLoader); 

    if(oldLoader != null) { 
     stage.removeChild(oldLoader); 
     oldLoader = null; 
    } 

    oldLoader = newLoader; 
} 
+1

Je pense avoir trouvé la solution. Si vous utilisez removeChild, il arrête seulement d'afficher, mais le tout est toujours en mémoire (cache). Ainsi, plus vous chargez les vidéos, plus vous remplissez le cache. Nous avons besoin de quelque chose qui efface complètement le cache avant de charger une autre vidéo. J'ai utilisé unloadAndStop() et il semble avoir complètement fait l'affaire, sauf si quelqu'un a quelque chose contre. Merci encore – Sthe

+1

Doit absolument faire l'affaire. Il y a des cas spéciaux où unloadAndStop ne fonctionnera pas correctement. Mais dans votre cas de chargement-affichage-suppression, tout devrait être bon. – Bakapii

Questions connexes