jeu Android - comment stocker les éléments du jeu pour que gc ne tire pas

8

Je suis en train de développer un jeu Android et j'ai une question sur le stockage des éléments du jeu sans déclencher le ramasse-miettes.

Mon jeu a besoin d'une collection où les éléments du jeu sont stockés selon les positions x, y (tous les éléments du jeu ont x, y, largeur et hauteur). La collection est ensuite appelée chaque image pour récupérer les éléments selon cameraX, cameraY, largeur et hauteur de la caméra (l'utilisateur peut faire défiler le jeu).

Exemple:

 function draw() {
   tmp = collection.getElements(tmp,cameraX,cameraY,cameraWidth,cameraHeight);
     for(int i = 0; i < tmp.size(); i++) {
        tmp.get(i).draw();
     } 
  }

J'utilise actuellement la classe Vector pour représenter les éléments de la collection, mais le gc continue de se déclencher toutes les deux minutes. Je fais toutes mes allocations à l'avance. J'ai également modifié la fonction getElements pour accepter 1 paramètre supplémentaire - un vecteur temporaire (alloué à l'avance) qui est rempli d'éléments puis renvoyé.

Comment dois-je stocker les éléments du jeu pour que le gc ne tire pas (je préfère jamais si possible)?

J'ajoute également des éléments à la collection pendant l'exécution, dois-je également les allouer dès le départ?

Jernej
la source

Réponses:

3

Oui, si vous allouez quoi que ce soit au moment de l'exécution, cela déclenchera éventuellement le GC. Généralement, vous contournez cela en implémentant un pool d'objets ... de cette façon, vous pouvez préallouer (ou au moins collecter de nouvelles instances pour les réutiliser) tous les objets comme les puces et autres entités pour éviter de déclencher le GC.

edit: Vous pouvez également utiliser un profileur de mémoire (comme l' analyseur de mémoire Eclipse ) qui peut vous aider à déterminer quelle routine génère des objets au moment de l'exécution.

Joel Martinez
la source
donc instants d'utiliser une classe Vector utiliser MyObject []? Mais ensuite, je dois préallouer la taille du pool d'objets pour pouvoir ajouter et supprimer des objets de manière dynamique ... quelque chose comme MyObject [] pool = new MyObject [MAX_OBJECTS]; c'est ce que tu voulais dire?
Jernej
plus précisément, si vous voulez éviter à 100% de nouvelles allocations d'objets, vous devez allouer chaque instance contenue dans ce tableau. J'ai écrit une classe en C # pour le framework XNA qui atteint un bel équilibre ... il ne crée de nouvelles instances que lorsque le pool n'a pas d'instance existante à donner. Le résultat est que les premières secondes peuvent allouer quelques objets, mais une fois que nous avons atteint le nombre maximal d'instances simultanées, aucune nouvelle allocation ne se produit. Devrait être relativement facile à convertir en java: codecube.net/2010/01/xna-resource-pool
Joel Martinez
2

Je suggère également de lire le code source de Replica Island , qui a été développé par un ingénieur Android. Il a une classe de pool d'objets générique qui peut être étendue pour des pools d'objets personnalisés. Il a également une classe de tableau personnalisée (avec des capacités d'ajout / suppression / recherche) pour éviter d'avoir à utiliser un itérateur lors de la traversée d'un tableau d'objets.

J'aimerais également mentionner que le DDMS sur le SDK Android dans Eclipse peut suivre les allocations de mémoire (voir l'onglet Allocation Tracker dans l'image).

f20k
la source