Priorité des fichiers (PriorityMassLoader)
Par Cédric Tabin le vendredi 18.04.2008, 08:00 - ActionScript - Lien permanent
Issue de mon projet masapi, la classe PriorityMassLoader permet non seulement de définir la priorité de chacun des fichiers à charger, mais également de modifier leur mode de chargement. Voici quelques explication détaillées quant à son utilisation !
Tout d'abord concernant masapi, il y a une série d'examples sur les différentes parties de l'API. J'ai également mis la documentation en ligne.
Dans la dernière version (1.1), une nouvelle classe a été ajoutée afin de faciliter l'utilisation d'un MassLoader qui gère les priorité : la classe CompositePriorityMassLoader.
import ch.capi.net.*; var cpl:CompositePriorityMassLoader = new CompositePriorityMassLoader(); var file1:ILoadableFile = cpl.addPrioritizedFile("engine.swf", 10); //loaded second var file2:ILoadableFile = cpl.addPrioritizedFile("config.xml", 15); //loaded first var file3:ILoadableFile = cpl.addPrioritizedFile("aSWF", 0, LoadableFileType.SWF); //loaded third var file4:ILoadabelFile = cpl.addFile("aPicture.jpg", LoadableFileType.BINARY); //loaded fourth (priority=0) cpl.start();
La gestion basique est assez simple : plus la priorité est élevée, plus le fichier a d'importance.
Il est intéressant d'observer le comportement de la classe PriorityMassLoader pour charger les fichiers. Le comportement par défaut va procéder de manière à charger ensemble tous les fichiers ayant le même ordre de priorité :
import ch.capi.net.*; import ch.capi.events.*; var cpl:CompositePriorityMassLoader = new CompositePriorityMassLoader(); var file1:ILoadableFile = cpl.addPrioritizedFile("engine.swf", 10); var file2:ILoadableFile = cpl.addPrioritizedFile("config.xml", 15); var file3:ILoadableFile = cpl.addPrioritizedFile("aSWF", 0); var file4:ILoadabelFile = cpl.addFile("aPicture.jpg"); var file5:ILoadableFile = cpl.addPrioritizedFile("otherSWF", 10); cpl.massLoader.addEventListener(MassLoadEvent.FILE_OPEN, onFileOpen); cpl.massLoader.addEventListener(MassLoadEvent.FILE_CLOSE, onFileClose); cpl.massLoader.addEventListener(PriorityEvent.PRIORITY_CHANGED, onPriorityChanged); cpl.start(); function onFileOpen(evt:MassLoadEvent):void { trace("open : "+(evt.file as ILoadableFile).urlRequest.url); } function onFileClose(evt:MassLoadEvent):void { trace("close : "+(evt.file as ILoadableFile).urlRequest.url); } function onPriorityChange(evt:PriorityEvent):void { trace("new priority : "+evt.currentPriority; }
La sortie suivante sera affichée :
new priority : 15 open : config.xml close : config.xml new priority : 10 open : engine.swf open : otherSWF close : engine.swf close : otherSWF new priority : 0 open : aSWF open : aPicture.jpg close : aSWF close : aPicture.jpg
Le PriorityMassLoader force un fichier avec une priorité élevée à être complètement chargé avant de lancer le chargement d'un autre fichier moins important. Cela peut être très utile, notamment lorsque les fichiers sont inter-dépendants et que certains ont absolument besoin que d'autres soient chargés afin de pouvoir fonctionner.
Bien évidemment, ce comportement peut être changé simplement en mettant la variable loadByPriority à false. Dans ce cas, c'est la variable parallelFiles qui sera prise en compte pour savoir combien de fichiers doivent être chargés simultanément (en tenant compte de la priorité).
import ch.capi.net.*; import ch.capi.events.*; var cpl:CompositePriorityMassLoader = new CompositePriorityMassLoader(); var pml:PriorityMassLoader = cpl.massLoader as PriorityMassLoader; pml.loadByPriority = false; pml.parallelFiles = 3; //3 files at the same time var file1:ILoadableFile = cpl.addPrioritizedFile("engine.swf", 10); var file2:ILoadableFile = cpl.addPrioritizedFile("config.xml", 15); var file3:ILoadableFile = cpl.addPrioritizedFile("aSWF", 0); var file4:ILoadabelFile = cpl.addFile("aPicture.jpg"); var file5:ILoadableFile = cpl.addPrioritizedFile("otherSWF", 10); cpl.start();
Pour terminer, il y a le googlegroup de masapi sur lequel j'annoncerai les futures mises à jour et tutoriaux ! Pour les intéressés, inscrivez-vous
L'étape suivante est la gestion des dépendances entre fichiers !
Commentaires
Quel est l'avantage de cette API par rapport à BulkLoader qui fait ça tres bien et qui est supporté par une large communauté ?
Salut,
Très bonne question Le point fort de masapi est de pouvoir gérer l'inter-dépendance des fichiers de manière entièrement automatisée juste grâce à un fichier XML assez simple. Il est vrai que cet "avantage" est mal mis en avant, faute de tuto/temps, mais je vais corriger cela sous peu !
@++
Est-ce que c'est vraiment utile de gérer les priorités de chargement alors qu'on pourrait se contenter d'insérer les fichiers dans une liste de chargement et traiter cette liste dans l'ordre. En gros, jamais tu vas charger 100 images et ensuite un XML ou un swf qui doit les contrôler. Tu feras les choses dans l'ordre, nan ?
Salut,
Non justement il y a une grosse différence avec l'utilisation du PriorityMassLoader : le chargement d'un fichier à une priorité x (prenons 10) ne sera lancé seulement APRES que tous les fichiers à une priorité y (11, 12, bref supérieure) aient été chargés !
Cela peut être très important car dans le cas du MassLoader (si tu charges les fichiers tous en parallèles), le nième fichier dans la liste pourra être complètement chargé avant le premier (par exemple, le 1er fichier pèse 5Mo et le 5ème 10ko...). Et ça peut poser des problèmes assez fondamentaux (notamment dans le cas de fichiers inter-dépendants) !
En gros, ca t'évite de vérifier si le fichier x est chargé et, dans le cas contraire, te mettre en attente => moins de code, moins de bug, plus de lisibilité, bref que tu bonheur :D
@++
BulkLoader gère déjà très bien les priorités.
J'avoue que j'ai du mal à vraiment saisir le réel avantage de ta classe...
Salut,
Par rapport à BulkLoader, ma classe fait très sensiblement la même chose. Par contre, elle devient indispensable lorsque l'ApplicationMassLoader va être utilisé, car c'est elle qui garanti que le fichier A sera chargé avant le fichier B !
@++