Estou desenvolvendo um jogo para Android e tenho uma pergunta sobre como armazenar os elementos do jogo sem disparar o coletor de lixo.
Meu jogo precisa de uma coleção na qual os elementos do jogo sejam armazenados de acordo com as posições x, y (todos os elementos do jogo têm x, y, largura e altura). A coleção é chamada de cada quadro para recuperar os elementos de acordo com cameraX, cameraY, largura e altura da câmera (o usuário pode rolar o jogo).
Exemplo:
function draw() {
tmp = collection.getElements(tmp,cameraX,cameraY,cameraWidth,cameraHeight);
for(int i = 0; i < tmp.size(); i++) {
tmp.get(i).draw();
}
}
Atualmente, estou usando a classe Vector para representar os elementos da coleção, mas o gc continua disparando a cada dois minutos. Eu faço todas as minhas alocações antecipadamente. Também modifiquei a função getElements para aceitar mais 1 parâmetro - um vetor temp (alocado antecipadamente) que é preenchido com elementos e depois retornado.
Como devo armazenar os elementos do jogo para que o gc não acione (prefiro nunca, se possível)?
Também adiciono elementos à coleção durante o tempo de execução, também tenho que alocá-los antecipadamente?
Também sugiro a leitura do código-fonte da Replica Island , desenvolvido por um engenheiro do Android. Ele tem uma classe de pool de objetos genéricos que pode ser estendida para pools de objetos personalizados. Ele também tem uma classe de matriz personalizada (com recursos de adição / exclusão / pesquisa) para evitar a necessidade de usar um iterador ao percorrer uma matriz de objetos.
Também gostaria de mencionar que o DDMS no Android SDK no Eclipse pode rastrear alocações de memória (consulte a guia Rastreador de alocação na imagem).
fonte