Forums Développement Multimédia

Aller au contenu

Performances AIR mobile / loaders

CODE Actionscript

11 réponses à ce sujet

#1 tdajab

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 102 messages

Posté 09 April 2013 - 11:36 AM

Bonjour à tous,

Je développe actuellement une application de cartographie sur mobile avec AIR. Je fais des tests de performance pour le chargement des fonds de carte et je me pose les questions suivantes : vaut-il mieux charger une seule grosse image puis la travailler en BitmapData ou charger une multitude de fichiers (rasters) et les assembler en code ? Ou encore, serait-il envisageable de compiler directement l'appli avec la ou les images (embed) ?

Après quelques tests, il semblerait que le chargement d'images via la classe Loader soit assez gourmand en ressources sur Android (tests sur un HTC Desire). De fait, l'appli semble "freezer" lors de chaque chargement et les évènements progress ne sont pas envoyés. Je n'arrive pas à savoir si la lenteur vient de la lecture sur disque ou du décodage des données dans Flash.

Du coup, charger une multitude d'images est beaucoup plus lent que d'en charger une seule grosse, mais comme je ne peux pas afficher de progression, il y a un blanc de plusieurs secondes avant que l'appli ne redevienne opérationnelle, et pas moyen d'afficher la progression du chargement.

Je n'ai pas testé la solution "embed" mais j'ai lu qu'il était préférable de garder l'exécutable le plus léger possible même sur mobile.

Bref, avez-vous déjà rencontré ce type de problème ? Comment procéderiez-vous ?

Un grand merci d'avance !

#2 Tonic

    Plop

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5712 messages

Posté 09 April 2013 - 14:16 PM

Salut,

tu utilises une API de cartographie pour ton besoin ?
En règle général, les fonds de carte sont accessibles sous formes de tuiles plutôt qu'une grosse image unique.

#3 tdajab

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 102 messages

Posté 09 April 2013 - 14:27 PM

Salut,

Non c'est une appli qui doit marcher offline, je fais donc le programme à la main. Effectivement les fonds de carte qu'on récupère sont bien découpés en tuiles/rasters, mais je peux les assembler en amont et ne garder qu'une grande image.

C'est plutôt le soucis du freeze lors du chargement qui me semble bizarre, je ne comprends pas pourquoi c'est bloquant alors que Loader fonctionne normalement en asynchrone...

#4 Tonic

    Plop

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5712 messages

Posté 09 April 2013 - 14:55 PM

Ca m'étonne que ton application freeze à ce point, tu lances à peu prêt combien de loader simultanément ?

Un peu de code ?

#5 tdajab

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 102 messages

Posté 09 April 2013 - 15:37 PM

Je lance les loaders un par un avec une classe à moi (en PJ). Et dans mon test avec une seule image, j'ai un seul et unique loader.

Fichier(s) joint(s)



#6 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 09 April 2013 - 15:39 PM

t'as pas mis la piece jointe ;)

#7 tdajab

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 102 messages

Posté 09 April 2013 - 15:47 PM

oups désolé je viens d'éditer ;-)

#8 tdajab

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 102 messages

Posté 09 April 2013 - 15:52 PM

Je fais d'autres tests sur un Samsung Galaxy et là le temps de chargement est beaucoup moins long, mais idem pas moyen d'avoir de progression pendant le chargement.

En y réfléchissant, quand on lance un swf classique en local, les évènements de progression ne sont pas envoyés non plus, à moins de passer par un serveur virtuel, mais c'est quasi instantané sur un poste fixe...

#9 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 09 April 2013 - 16:06 PM

Bon bon bon.

Faut faire propre avec les mobiles !

1 Tu n'utiliseras et de static même si ça te semble pratique!
2 Tu veilleras à ne pas trop charger la RAM (donc quand c'est trop trop trop trop, tu la vide, avec des unload et faut pas attendre le dernier moment que le GC est un salle truc ... ) !

Pour le petit 2 faut que tu nous dises qu'elle est le poids de ta map en full-resolution et qu'elle taille a t'elle ?

#10 tdajab

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 102 messages

Posté 09 April 2013 - 16:27 PM

Merci de ta réponse :-)

La carte que j'utilise pour les tests est relativement "petite", je suis en 2048x2048 en pleine résolution (~3.6mo). En raster je découpe des images de 128x128, donc 256 tuiles en zoom max. Mais la carte définitive sera 3 ou 4 fois plus grande. Donc il me semble en effet que charger une seule image va poser des gros soucis de mémoire.

Par curiosité, pourquoi ne pas travailler en static dans ce cas ? En général j'évite mais là j'avais besoin d'une solution rapide, et je trouve ça plutôt efficace en fait, ça évite de balader des références d'une classe à l'autre ou de multiplier les écouteurs.

#11 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 09 April 2013 - 16:42 PM

pour info ;)

Citation


Getting & setting a property of this object : 7 millisec
Getting & setting a static property of this class : 10 millisec
Static access is slower by : 43%

Getting & setting a property of another object : 8 millisec
Getting & setting a static property of another class : 94 millisec
Static access is slower by : 1075%

Calling a method of this object : 90 millisec
Calling a static method of this class : 93 millisec
Static access is slower by : 3%

Calling a method of another object : 92 millisec
Calling a static method of another class : 176 millisec
Static access is slower by : 91%

http://blog.controul...s3avm2-exactly/

Je pense que le freeze et du a une surcharge pondéral dans ton application !
Trace ta mémoire sur quelque mouvement et vois ce qui ce passe !

(? tu codes en c ou en cpp, si oui j'ai des trucs à te presenter ?)

#12 tdajab

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 102 messages

Posté 09 April 2013 - 16:55 PM

Ah ok effectivement, c'est loin d'être négligeable, je ne pensais pas que ça pouvais jouer autant, merci du conseil !

En l’occurrence quand je charge une seule image je n'utilise pas cette classe mais un simple loader. Le freeze est vraiment juste pendant le chargement, cad au tout début, ensuite l'appli tourne à 30fps et la mémoire ne bouge plus d'un poil.

J'ai essayé avec un FileStream+Loader.loadBytes() et le résultat est le même :-(.

Sinon je fais un peu de Java mais pas de C (pas en prod en tout cas^^).

Merci quand même :-)



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

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

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP