El uso de colecciones en el desarrollo de juegos de Android no se recomienda?

10

Mientras trabajaba en un proyecto de juego para Android, estaba buscando información sobre la optimización del rendimiento del código del juego. Y llegué a saber que el uso de colecciones de Java como List, Arraylist, etc. no se recomienda en los códigos de juego, aunque la colección es una herramienta útil en la programación de Java. ¿Por qué es así? Me gustaría conocer los detalles técnicos, ¿cuánto impacto puede tener el framework Collection en los sistemas Android y por qué? Cualquier ayuda a este respecto será genial.

GamDroid
fuente
¿Dónde leíste eso?
egarcia
probablemente aquí: developer.android.com/guide/practices/design/performance.html Tenga en cuenta cómo dice: Para resumir: use el bucle mejorado for de forma predeterminada, pero considere un bucle contado escrito a mano para la iteración ArrayList crítica del rendimiento.
Nailer

Respuestas:

8

Se trata principalmente de asignación de memoria y recolección de basura. Las asignaciones de memoria durante el tiempo de ejecución le dan a su recolector de basura la oportunidad de sacar la basura. Lo que perjudica tu rendimiento. GC debe ocurrir tan raramente como sea posible.

La mayoría de las colecciones de Java:

A) Asignar más memoria de la que necesitan.

B) Asigne memoria cuando no quiera que lo hagan.

C) Asignar memoria para cada iterador al iterar a través de una colección.

Para eludir estas cosas:

A) Asignar colecciones con tamaños fijos. es decir. crear agrupaciones de objetos.

B) Asigne estos grupos al inicio del programa.

C) Evite el for (Object obj: collection) para aquellos tipos de colección que tienen un método size () y .get (int index).

Fabricante de clavos
fuente
2
Todos los puntos válidos, pero tenga en cuenta: "Deberíamos olvidarnos de las pequeñas eficiencias, digamos alrededor del 97% del tiempo: la optimización prematura es la raíz de todo mal". Debe limitar tales optimizaciones a los lugares donde son realmente necesarias. En todos los demás lugares, lucha por un diseño claro y simple.
Michael Klement
@Michael: en los sistemas actuales, con cachés rápidos y memoria lenta y múltiples núcleos, las asignaciones de memoria son lo más costoso que puede hacer.
2
@ Michael: Sería difícil encontrar un motor de juego comercial de alto rendimiento que no esté haciendo todo lo posible para optimizar sus patrones de asignación de memoria. Aquí hay una larga charla sobre el tema de los juegos de Android en tiempo real. Es un poco viejo, pero la mayor parte aún debería aplicarse: youtube.com/watch?v=U4Bk5rmIpic
Nailer el
Claro, no me malinterpreten: no quería estar en desacuerdo con su respuesta. Solo quería señalar que debe optimizar juiciosamente y en los lugares correctos. No hay ningún beneficio en usar Arrays sobre Colecciones en un lugar que tiene un impacto mínimo en el rendimiento (digamos 1%) (También se trata más detalladamente aquí: developer.android.com/guide/practices/design/… )
Michael Klement
3
@AttackingHobo: No estoy de acuerdo. Optimizar a ciegas no es beneficioso, que es lo que me parece su declaración (corríjame si me equivoqué). Chris Pruett también declaró en el video de Google IO vinculado anteriormente: "Elija la flexibilidad sobre la velocidad todos los días de la semana ... hasta que el juego se dañe". y estoy de acuerdo con esto
Michael Klement