L'utilisation des collections dans le développement de jeux Android n'est pas encouragée?

10

En travaillant sur un projet de jeu pour Android, je cherchais des informations sur l' optimisation des performances du code de jeu. Et j'ai appris que l'utilisation de collections Java comme List, Arraylist, etc. n'est pas encouragée dans les codes de jeu, bien que la collecte soit un outil utile dans la programmation Java. J'aimerais connaître les détails techniques sur l'impact du framework Collection sur les systèmes Android et pourquoi? Toute aide à cet égard sera formidable.

GamDroid
la source
Où avez-vous lu ça?
egarcia
probablement ici: developer.android.com/guide/practices/design/performance.html Notez comment il dit: Pour résumer: utilisez la boucle for améliorée par défaut, mais envisagez une boucle comptée manuscrite pour l'itération ArrayList critique pour les performances.
Nailer

Réponses:

8

Il s'agit principalement d'allocation de mémoire et de récupération de place. Les allocations de mémoire pendant l'exécution permettent à votre garbage collector de faire ressortir la corbeille. Ce qui nuit à vos performances. GC devrait se produire aussi rarement que possible.

La plupart des collections Java:

A) Allouez plus de mémoire que nécessaire.

B) Allouez de la mémoire lorsque vous ne le souhaitez pas.

C) Allouez de la mémoire à chaque itérateur lors de l'itération dans une collection.

Pour contourner ces choses:

A) Attribuez des collections de tailles fixes. c'est à dire. créer des pools d'objets.

B) Allouez ces pools au démarrage du programme.

C) Évitez le for (Object obj: collection) pour les types de collection qui ont une méthode size () et .get (int index).

Cloueur
la source
2
Tous les points valables, mais gardez à l'esprit: "Nous devons oublier les petites efficacités, disons environ 97% du temps: l'optimisation prématurée est la racine de tout mal". Vous devez limiter ces optimisations aux endroits où elles sont vraiment nécessaires. Dans tous les autres endroits, luttez pour un design clair et simple.
Michael Klement
@Michael: Sur les systèmes d'aujourd'hui, avec des caches rapides et une mémoire lente et plusieurs cœurs, les allocations de mémoire sont à peu près la chose la plus coûteuse que vous puissiez faire.
2
@Michael: Vous auriez du mal à trouver un moteur de jeu commercial de haute performance qui ne ferait pas autant que possible pour optimiser ses modèles d'allocation de mémoire. Voici une longue discussion sur le sujet des jeux Android en temps réel. C'est un peu vieux, mais la plupart devraient toujours s'appliquer: youtube.com/watch?v=U4Bk5rmIpic
Nailer
Bien sûr, ne vous méprenez pas: je ne voulais pas être en désaccord avec votre réponse. Je voulais juste souligner que vous devez optimiser judicieusement et aux bons endroits. Il n'y a aucun avantage à utiliser les tableaux sur les collections à un endroit qui a un impact minimal sur les performances (disons 1%). (Également discuté plus en détail ici: developer.android.com/guide/practices/design/… )
Michael Klement
3
@AttackingHobo: Je ne suis pas d'accord. L'optimisation à l'aveuglette n'est pas bénéfique, ce qui ressemble à votre déclaration (corrigez-moi si je me trompe). Chris Pruett a également déclaré dans la vidéo Google IO liée ci-dessus: "Choisissez la flexibilité plutôt que la vitesse tous les jours de la semaine ... jusqu'à ce que le gameplay soit endommagé." et je suis d'accord avec cela.
Michael Klement