

Starling : Pertinence des Atlas avec LostContext
#1
Posté 24 August 2013 - 22:22 PM
D'après ce que j'ai pu lire sur les forums de starling, palier au LostContext de starling est très couteux, 2x la consomation de mémoire des assets normaux. Sur du devellopement mobile, consommer deux fois plus de mémoire vive peut être vraiment catastrophique, je me questionne donc de la pertinence d'utiliser un Atlas dans ce cas là.
En effet, pour que starling puisse récuperer d'un LostContext, il a besoin que le bitmap d'origine des textures soit toujours actif. Mais dans la documentation, il est fortement conseillé pour des question de performance du rendu d'utiliser le minimum d'atlas pour les passes graphiques. Ainsi, quel est la meilleur option ? Abandonner l'atlas, tirer chaque texture du bitmap d'origine, et perdre de la vitesse de rendu graphique, ou utiliser l'atlas, garder un doublon de chaque texture et consommer 2x plus de mémoire?
Merci pour vos conseils.
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Jeux Android
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Website
Doodah Productions
#2
Posté 24 August 2013 - 23:13 PM
Citation
Qu'est ce que le LostContext, tu peux développer un peu s'il te plait
Merci d'avance !
#3
Posté 25 August 2013 - 20:51 PM
Le LostContext se produit sur Stage 3D lorsque la plateforme passe en veille alors que l'application est en train de tourner. Sur PC, tu peux reproduire un lostContext en faisant Ctrl + Alt + Suppr, ainsi, ton application sera vide et lancera cette erreur : Device lost Context
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Jeux Android
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Website
Doodah Productions
#4
Posté 25 August 2013 - 21:47 PM

Et par curiosité, quelle est la solution proposé sur les forums starling ?
EDIT :
je ne comprend pas cette phrase
Citation
Je suis sur de ne pas comprendre le problème

#5
Posté 25 August 2013 - 21:50 PM
Starling.handleLostContext = true;
Mais cela ne marche qu'a condition que les bitmaps qui t'ont servis a generer l'instance des textures soient toujours actifs. Tu ne peux donc pas les liberer la memoire de ces derniers :
http://forum.starlin...-device-context
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Jeux Android
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Website
Doodah Productions
#6
Posté 25 August 2013 - 22:44 PM
Dans quel cas de figure tu affiches un truc à l'écran sans avoir le bitmapData en RAM ? Le bitmapData n'est pas forcément actif ?
Désolé mais un truc m'échappe
#7
Posté 25 August 2013 - 22:47 PM

#8
Posté 25 August 2013 - 23:20 PM
Citation
Désolé mais un truc m'échappe
Bien imaginons que tu crée un atlas de textures, tu vas d'abord charger ton bitmap data, puis en extraire un objet de classe texture que tu vas stocker dans ton Atlas. A ce point, tu as deux fois la même donnée : le bitmap d'origine, et la texture, qui chaqu'un prennent leur lot de mémoire. D'apres la doc de starling, si tu utilise les Atlas comme source de toutes les textures utilisées, tu gagne en rapidité d'affichage car le GPU peut alors ne faire qu'une seule et unique passe (si j'ai bien compris, le GPU réalise une passe par source de texture), a ce point, etant donné que tu ne vas plus utiliser qu'un seul atlas, tu peux te permettre de supprimer tous les doublons Bitmap de la mémoire.
A ce point, si starling perd le contexte, il semble incapable de regenerer les textures si les bitmaps sont disposés.
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Jeux Android
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Website
Doodah Productions
#9
Posté 25 August 2013 - 23:39 PM

Un Atlas n'est qu'une bitmapData contenant plusieurs images dont chacune est accessible en jouant sur le repère de texture (UV).
Que tu utilises ou non les Atlas, il y a forcément un bitmapData.
si cela est possible, il est effectivement préférable d'avoir le moins d'objet Texture possible, car chaque objet Texture sous entend une "passe" de rendu, et c'est pourquoi il est hautement recommandé d'utilisé des "Atlas" qui permettent à plusieurs images de partager la même texture et donc d'économiser des "passes" de rendu.
Ah je crois que je commence à comprendre.

Actuellement, tu "dispose" ton bitmapData coté CPU après l'avoir injecté dans le GPU sous forme d'un objet Texture, c'est ça ?
Je suis un peu étonné par ce genre d'optimisation à vrai dire, mais pourquoi pas

Dans ce cas, j'appliquerais la solution dont je parles plus haut, à savoir gérer le 'lostContext' par toi-même

Il suffit de retrouver le moment ou le lostContext est déclenché (j'imagine qu'il y a un évenement) et à ce moment là vider toutes les Textures, recharger les assets et recréer les texture. Le temps de faire ça - car ca va risque de prendre quelque secondes s'il y a beaucoup de texture - tu met une image genre splashScreen à la place du jeu avec un message "please wait" et voilà !
EDIT : je crois vraiment qu'il vaut mieux faire attendre les gens 3 secondes au démarrage et que tout soit fluide partout plutôt que de lancer le jeu instantanément et que ça rame.
#10
Posté 25 August 2013 - 23:43 PM
Je vais essayer de monter ce systeme pour mon prochain projet.
Oui je dispose le bitmpa d'origine ainsi que son loader afin de recuperer le maximum de memoire possible. Tu semble surpris, est-ce que je devrais éviter de faire ça ?
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Jeux Android
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Website
Doodah Productions
#11
Posté 25 August 2013 - 23:55 PM

L'idée est intéressante je trouve, je pensais jusqu'à maintenant que l'objet Texture pointait vers l'objet BitmapData (et que celui ci ne pouvait de fait qu'être actif) mais donc non - et maintenant que j'y pense c'est logique

Ceci dit, à part économiser de la batterie - c'est toujours ça de pris - , je doute que cela améliore les perfs de l'appli de faire ça - mais ça ne peut pas leur faire de mal

Donc si ! si ! Continue de faire ça, ça ne peut être que mieux

#12
Posté 25 August 2013 - 23:59 PM
#13
Posté 26 August 2013 - 00:09 AM
Citation
Ha bon ? Jusqu'a présent j'ai toujours utilisé des loaders pour charger mes images, je n'aurais donc pas besoin de faire cela?
Citation
Sur mobile, une application n'a qu'une certaine quantité de mémoire vive autorisée, si l'appli dépasse celle-ci, le device ferme l'application afin de garantir la stabilité de la plateforme. Ainsi, si tu garde le bitmap et la texture, tu multiplie par deux la mémoire utilisée, ce qui deviens très rapidement un problème...
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Jeux Android
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Website
Doodah Productions
#14
Posté 26 August 2013 - 00:24 AM

Citation
En fait, tu n'as même pas besoin de bitmapData du tout puisque tu peux uploader les images dans les textures directement depuis un ByteArray (je suppose que c'est plus rapide en plus d'être plus léger car on zappe l'étape de conversion Bytes -> BitmapData->Byte->Texture ; on fait directement Bytes->Texture , ce qui ne peut qu'être plus rapide

#15
Posté 26 August 2013 - 00:37 AM
Un Atlas correspond au duo BitmapData + donnée de positionnement de chaque image dans la texture.
Du coup, il me parait tout à faire possible de faire un "dispose" du BitmapData de L'alias tout en conservant ces données de positionnement qui reste valable coté GPU
#16
Posté 26 August 2013 - 00:58 AM

var file:File = File.applicationDirectory.resolvePath("monImage.jpg");
var fileStream:FileStream = new FileStream();
fileStream.open(file, FileMode.READ);
var bytes:ByteArray = new ByteArray
fileStream.readBytes(bytes);
fileStream.close();
#17
Posté 26 August 2013 - 02:31 AM
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Jeux Android
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Website
Doodah Productions
#18
Posté 26 August 2013 - 03:56 AM
Pour ce qui est de la Texture
var texture:Texture = context3D.createTexture();
texture.uploadFromByteArray(bytes)
#19
Posté 26 August 2013 - 12:11 PM
Là j'ai pas trop le temps
#20
Posté 26 August 2013 - 15:33 PM
Je vais tenter ça, et je reviens ici pour te tenir au courant, merci !
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Jeux Android
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Website
Doodah Productions
#21
Posté 30 August 2013 - 20:47 PM
J'ai tourné un peu autour de cette approche et je suis un peu bloqué.
Dans un premier temps j'aimerais transformer le byteArray en bitmapData afin d'en extraire une texture (starling propose une fonction pour faire ça), mais je n'ai aucune idée de comment faire pour connaitre les valeurs width et height de mon bitmapData final a partir du bytesArray, y-a-t-il un moyen de retrouver ça ?
Merci.
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Jeux Android
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Website
Doodah Productions
#22
Posté 30 August 2013 - 22:03 PM
Je ne connais pas la solution mais à ta place - sauf si tu as un nombre astronomique de bitmapData - , je coderais les valeurs en dur
Ceci dit, si quelqu'un a la réponse à la question que tu poses, ca m'intéresse aussi

#23
Posté 30 August 2013 - 22:30 PM
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Jeux Android
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Website
Doodah Productions
#24
Posté 31 August 2013 - 13:52 PM

#25
Posté 31 August 2013 - 13:54 PM
- éh dis donc, tu n'as pas beaucoup cherché ! C'est le premier lien que j'ai trouvé en tapant "as3 bytearray bitmapdata width" sur google... -
http://www.bytearray.org/?p=1089
#26
Posté 01 September 2013 - 06:35 AM
http://www.w3.org/TR...-Structure.html
Quand j'aurais fini ma classe je la partagerais ici.
Citation
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Jeux Android
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Website
Doodah Productions
#27
Posté 01 September 2013 - 09:58 AM
Citation
Je ne savais pas ce que j'allais trouvé en tapant les mots clé que j'ai tapé tu sais... Mais je suis un peu surpris d'avoir pour ma part trouver si facilement mais bon c'est pas grave

#28
Posté 01 September 2013 - 19:34 PM
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Jeux Android
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Website
Doodah Productions
#29
Posté 04 September 2013 - 22:37 PM
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Jeux Android
Nefertiti's Quest
Slot Adventure Atlantis
Slot Adventure Maya
O.G.A. Bullet Hell Shooter
Go Postal
Darkness Rising
Website
Doodah Productions
1 utilisateur(s) li(sen)t ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)