O uso de coleções no desenvolvimento de jogos para Android não é incentivado?

10

Enquanto trabalhava em um projeto de jogo para Android, estava procurando algumas informações sobre otimização de desempenho para o código do jogo. E vim a saber que o uso de Java Collections como List, Arraylist etc não é incentivado em códigos de jogos, embora a coleção seja uma ferramenta útil na programação Java. Por que é assim? Gostaria de saber detalhes técnicos sobre quanto impacto o framework Collection pode ter nos sistemas Android e por quê? Qualquer ajuda a esse respeito será ótima.

GamDroid
fonte
Onde você leu isso?
egarcia
provavelmente aqui: developer.android.com/guide/practices/design/performance.html Observe como se diz: Para resumir: use o loop for aprimorado por padrão, mas considere um loop contado manuscrito para iteração ArrayList de desempenho crítico.
Pregador

Respostas:

8

É principalmente sobre alocação de memória e coleta de lixo. As alocações de memória durante o tempo de execução oferecem ao coletor de lixo a chance de trazer o lixo para fora. O que prejudica o seu desempenho. O GC deve acontecer o mais raramente possível.

A maioria das coleções java:

A) Aloque mais memória do que eles precisam.

B) Aloque memória quando não desejar.

C) Aloque memória para cada iterador ao iterar através de uma coleção.

Para contornar essas coisas:

A) Aloque coleções com tamanhos fixos. ie crie conjuntos de objetos.

B) Aloque esses pools no programa init.

C) Evite o for (Object obj: collection) para os tipos de coleção que possuem um método size () e .get (int index).

Nailer
fonte
2
Todos os pontos válidos, mas lembre-se: "Devemos esquecer pequenas eficiências, digamos 97% das vezes: a otimização prematura é a raiz de todo mal". Você deve limitar essas otimizações aos pontos em que são realmente necessárias. Em todos os outros lugares, lute por um design claro e simples.
Michael Klement
@ Michael: Nos sistemas atuais, com caches rápidos, memória lenta e vários núcleos, as alocações de memória são a coisa mais cara que você pode fazer.
2
@ Michael: É difícil encontrar qualquer mecanismo de jogo comercial de alto desempenho que não faça o máximo possível para otimizar seus padrões de alocação de memória. Aqui está uma longa conversa sobre o assunto de jogos android em tempo real. É um pouco velho, mas a maioria ainda deve aplicar: youtube.com/watch?v=U4Bk5rmIpic
Nailer
Claro, não me entenda mal: eu não queria discordar de sua resposta. Eu só queria ressaltar que você deve otimizar criteriosamente e nos lugares certos. Não há benefício em usar Arrays sobre coleções em um local que tenha um impacto mínimo no desempenho (digamos 1%). (Também discutido de forma mais elaborada aqui: developer.android.com/guide/practices/design/… )
Michael Klement
3
@ AttackingHobo: Eu discordo. Otimizar cegamente não é benéfico, que é o que sua declaração me soa (corrija-me se eu entendi errado). Chris Pruett também afirmou no Google IO Video link acima: "Escolha a flexibilidade sobre a velocidade todos os dias da semana ... até que a jogabilidade seja danificada". e eu concordo com isso.
Michael Klement