2012-03-15 9 views
6

Estoy creando un clon de asteroides, pero con algunas campanas y silbatos más.¿Cómo hacer esto más eficiente?

A partir de ahora tengo un ArrayList<Asteroid> que contiene todos los asteroides en la pantalla. Cada uno tiene un Vector asociado y amplía mi clase genereic GameObject que maneja el dibujo y la actualización y otras cosas comunes que cada objeto del juego tiene en común.

Dicho esto cada vez que destruyo un asteroide, creo un nuevo objeto Asteroid y lo agrego al ArrayList<Asteroid> ... Hay un retraso notable cuando esto sucede, ya que también creo partículas de explosión y supongo que este es el GC.

Mi idea era crear en lugar de nuevos objetos sobre la marcha, que puedo precrear un grupo de ellos y simplemente volver a usarlos.

¿Es esta la idea correcta? Además, ¿cuál es la forma más organizada y eficiente de hacerlo?

Cualquier otra idea sería genial también. Solo intento reducir la creación de todos estos objetos porque definitivamente está causando un retraso notable. ¡Gracias!

+1

¿Has intentado averiguar qué lleva tiempo con DDMS? – dan

+0

Supongo que la demora es causada por el código que espera que la explosión termine antes de crear un nuevo objeto de asteroide. Intenta hacer asincrónica la explosión de la animación de asteroides. – deed02392

+0

@dan: No he hecho esto, aunque creo que ayudará. No uso demasiado el DDMS, ¿cómo puedo usarlo para ver qué tarda más? –

Respuesta

5

Crear una agrupación de objetos y reutilizarlos es una buena idea. También creo que podría cambiar de ArrayList a Vector, porque los vectores están optimizados para la indexación aleatoria, lo que hará mucho cuando use un grupo.

Dado que dices que cada vez que destruyes un asteroide, agregas uno nuevo, parece que trabajas con una cantidad constante de asteroides. Entonces puede crear un grupo con una cantidad constante de miembros.

+0

¡Gracias! Definitivamente cambiaré a un 'Vector'. Esa es una gran sugerencia, y es bueno saberlo para proyectos futuros. –

5

(1) Considere diseñar sus objetos con un diseño Flyweight. Es un patrón comúnmente utilizado para objetos con características repetitivas. Un ejemplo de código Java está disponible aquí: http://en.wikipedia.org/wiki/Flyweight_pattern

(2) Si ya sabe cuántos objetos va a utilizar, considere incluir la creación de su objeto y algún otro proceso de inicialización en la página de carga.

+0

Creo que definitivamente voy a pasar a la pre-creación de los objetos que necesito. Tienes razón, ya que sé el número que necesito crear, entonces eso debería ayudar. Analizaré el patrón de peso mosca. Me gusta el sonido de eso. –

4

Por lo general, Java es muy bueno en la asignación de nuevos objetos y la realización de GC de los objetos que se crearon recientemente, así que no asumiría inmediatamente que la agrupación mejorará mucho las cosas. ¿Estás seguro de que no estás creando ninguna otra "basura" que pueda generar GC completo (el tipo de GC que pausa el programa por períodos prolongados)?

Puede verificar que realmente es el GC el causante del problema que observa al habilitar el "registro de GC detallado" (Google para esto hay varios argumentos de línea de comando para la JVM que lo habilitan con diferente nivel de detalle).

+0

No creo que esté creando otra "basura", pero la revisaré bien para estar seguro. Como estoy en Android, no puedo usar la JVM estándar, pero debería poder usar DDMS para determinar qué está haciendo la GC. –

+0

No he hecho ningún desarrollo de Android, así que lo que dije no puede ser válido con el Dalvik "JVM". Cuando desarrollé sistemas embebidos en tiempo real (lo he hecho mucho en el pasado), la agrupación fue una práctica estándar y llevarlo al extremo (la asignación previa de los objetos utilizados con más frecuencia) resolvió muchos problemas en tiempo real para mí en aquellos días. Sin embargo, sospecho que sería difícil hacer que tu juego sea "libre de asignación", ya que las bibliotecas de gráficos que estás usando probablemente estén asignando elementos dinámicamente ... – Javafanboy

4

Creo que sus efectos de partículas son los culpables de la desaceleración, no de la creación del objeto.

Los desarrolladores de juegos generalmente hacen grandes esfuerzos para asegurarse de que sus gráficos sean rápidos, pero hacen muchos compromisos de rendimiento en la creación de scripts. Esto es por una muy buena razón: el rendimiento alcanzado en la creación y el almacenamiento de los objetos del juego es, en la mayoría de los casos, insignificante en comparación con el éxito al calcular su física y dibujar sus gráficos.

intente reducir el número y la complejidad gráfica (sobre todo si tienen transparencia; los efectos de que se apilan muy rápidamente hasta una locura) de sus partículas.

+0

Creo que estás en lo cierto con las partículas siendo una desaceleración. Voy a tratar de crearlos en un hilo separado y ver si eso ayuda en absoluto. También llevan transparencia, por lo que también podría ser algo en lo que pensar. –

Cuestiones relacionadas