gioco Android - come conservare gli elementi del gioco in modo che gc non sparerà


8

Sto sviluppando un gioco Android e ho una domanda sulla memorizzazione degli elementi del gioco senza sparare il cestino.

Il mio gioco ha bisogno di una raccolta in cui gli elementi del gioco sono memorizzati in base alle posizioni x, y (tutti gli elementi del gioco hanno x, y, larghezza e altezza). La raccolta viene quindi chiamata ogni frame per recuperare gli elementi in base a cameraX, cameraY, larghezza e altezza della fotocamera (l'utente può scorrere il gioco).

Esempio:

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

Attualmente sto usando la classe Vector per rappresentare gli elementi della collezione, ma il gc continua a sparare ogni paio di minuti. Faccio tutte le mie allocazioni in anticipo. Ho anche modificato la funzione getElements per accettare un altro parametro: un vettore temp (allocato in anticipo) che viene riempito con elementi e quindi restituito.

Come devo conservare gli elementi del gioco in modo che il gc non si spari (preferisco mai se possibile)?

Inoltre aggiungo elementi alla raccolta durante il runtime, devo allocarli anche in anticipo?

Risposte:


3

Sì, se allocare qualcosa in fase di esecuzione, alla fine attiverà il GC. In generale, ci si aggira implementando un pool di oggetti ... in questo modo, è possibile preallocare (o almeno raccogliere nuove istanze per il riutilizzo) tutti gli oggetti come proiettili e altre entità per evitare di attivare il GC.

modifica: potresti anche voler utilizzare un profiler di memoria (come l' analizzatore di memoria eclipse ) che può aiutarti a capire quale routine genera oggetti in fase di esecuzione.


così istinto di utilizzare una classe Vector utilizzare MyObject []? Ma poi devo preallocare la dimensione del pool di oggetti in modo da poter aggiungere e rimuovere in modo dinamico oggetti ... qualcosa come MyObject [] pool = new MyObject [MAX_OBJECTS]; è questo che intendevi?
Jernej,

più specificamente, se si desidera evitare al 100% le allocazioni di nuovi oggetti, è necessario allocare ogni istanza contenuta in tale array. Ho scritto una classe in C # per il framework XNA che trova un buon equilibrio ... crea nuove istanze solo quando il pool non ha un'istanza esistente da dare. Il risultato è che i primi secondi potrebbero allocare alcuni oggetti, ma una volta raggiunto il numero massimo simultaneo di istanze, non si verificano nuove allocazioni. Dovrebbe essere relativamente facile da convertire in Java: codecube.net/2010/01/xna-resource-pool
Joel Martinez

2

Suggerisco anche di leggere il codice sorgente di Replica Island , sviluppato da un ingegnere Android. Ha una classe di pool di oggetti generici che può essere estesa per pool di oggetti personalizzati. Ha anche una classe di array personalizzata (con funzionalità di aggiunta / eliminazione / ricerca) per evitare di dover usare un iteratore quando si attraversa una matrice di oggetti.

Inoltre, vorrei ricordare che il DDMS su Android SDK in Eclipse è in grado di tenere traccia delle allocazioni di memoria (vedere la scheda Tracker allocazione nell'immagine).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.