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?
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).
la source