2011-05-28 24 views
11

Estoy usando java + AndEngine en mi juego.Optimización del juego AndEngine

Durante el juego tengo algunas heladas, busqué la información y encontró algunas medidas de cómo optimizar el rendimiento del juego:

  1. Evitar GC (recolector de basura) para ser llamada en la acción principal en el juego:
    a) no crees objetos mientras juegas;
    b) no cree objetos innecesarios;
  2. código Optimizar que se repite muy a menudo

I seguido estos pasos, pero nunca lo menos tengo algunos se congela durante el juego.

Ahora estoy creando y cargando todas las texturas antes de que el juego comenzara y no las descargué, ¿es una mala idea? ¿Cómo puedo optimizar el proceso del juego? ¿Tal vez tengo que liberar toda la memoria posible antes de la actividad principal y luego volver a cargarla después de cada nivel?

+2

¿qué pasa con los sprites? –

+0

hmm ... realmente, no los borro ahora, creo que tengo que descargar todo el stuf inútil antes de la actividad del juego – dilix

Respuesta

16
  1. reducir el tamaño de la textura.
  2. Reducir interruptores textura (también conocido como tratar de utilizar spritesheets, por lo que la textura tiene que ser cambiado tan poco como sea posible)
  3. Use texturas de menor calidad (RGBA4444 o RGB565 en lugar de RGBA8888) ..
  4. setIgnoreUpdate de llamadas donde el la entidad no necesita actualizaciones.
  5. Use SpriteBatches if possible.

FYI: La próxima versión de AndEngine (procedente mediados de diciembre) GLES2 deportes por lo que tiene muchas más posibilidades de mejorar el rendimiento con Shaders y entidades personalizadas.

También ejecutará la canalización de inicio (onLoadEngine/onLoadResources/onLoadScene/onLoadComplete) en el primer fotograma del GL-Thread, en lugar de bloquear, en el UI-Thread (directamente en onCreate).

También le permite descargar fácilmente las etapas de la tubería en Hilos, sin romper la tubería en su conjunto. Habrá una subclase de BaseGameActivity muy simple de implementar que muestra un ProgressDialog determinado mientras se ejecutan las etapas de la tubería. Las entidades aparecerán en el momento en que están adjuntas a la escena.

En general, esto significa que los tiempos de carga reales se reducen y, lo que es más importante, los tiempos de carga del fieltro se reducen significativamente. Crear una pantalla de carga es trivialmente fácil, a diferencia del dolor que era antes.

+4

Como se hace referencia en mi publicación, aquí hay información sobre la versión GLES2 de diciembre: http://www.andengine.org/forums/announces/andengine-gles2-pre-release-on-december-23rd-t6097.html –

+0

Any posibilidad de acelerar la visualización de mapas TMX? TMXLayer.draw() dibuja cada tesela por separado. ¿Hay alguna posibilidad de poner múltiples mosaicos TMX en un solo buffer de vértices y dibujarlos todos a la vez? – Yar

4

El enfoque que estoy usando es cargar todas las texturas necesarias antes de que comience el nivel. Cuando pase al siguiente nivel, debe descargar solo las texturas de los objetos que no son necesarios en el siguiente nivel. Otros, como el marcador o el fondo principal, no deberían cargarse. Y, por supuesto, debe descargar todas sus texturas en la actividad onStop. Es cierto que, en primer lugar, debe optimizar el código de bucle, por ejemplo, no debe acceder a ningún recurso durante un bucle, intente buscarlos antes de iniciar un bucle.

7

Probablemente necesites publicar información más específica acerca de tu juego, pero una sugerencia es asegurarte de que estés utilizando sprites y objetos nuevamente. Por ejemplo, si tu juego tiene algún tipo de objeto que se genera repetidamente (enemigos voladores aleatorios, balas, elementos repetitivos de fondo) intenta pensar en la cantidad máxima de ese objeto que necesitarás en la pantalla al mismo tiempo y luego crea esa cantidad antes de que comience el juego, cargándolos y restableciéndolos como necesites.

Por ejemplo, mi juego usa enemigos que "aleatoriamente" vuelan desde la parte superior de la pantalla. Al principio estaba creando un nuevo enemigo con cada llamada, pero ahora tengo una ArrayList que contiene solo 6 enemigos en total que se reutilizan y mueven cientos de veces cada uno. Esto resultó en un gran aumento de rendimiento para mí, especialmente en sesiones de juego más largas. Esto está relacionado con la optimización de GC, pero es algo que quizás no tengas antes sobre la optimización.

+5

La reutilización de objetos a menudo se conoce como _Object pooling_. El uso de un conjunto de objetos evitará que el GC se ejecute. – Eloff

5

No se puede exagerar la importancia de crear un perfil de su código antes de realizar optimizaciones preventivas. Tiene poco sentido optimizar todos los sprites, etc., si está vinculado a la GPU (esto es poco probable, pero como está utilizando GLES2.0 y la interconexión programable, y como no sabemos cómo ha escrito el código GLSL, es posible)

Hay algunas herramientas que puede usar para crear perfiles, ya que hay diferentes elementos para crear perfiles.

Para la creación de perfiles de memoria, puede usar el DDMS y la vista de seguimiento para verificar la asignación de memoria y la frecuencia con la que se llama al GC en un período de tiempo específico. Esta pregunta también lo ha hecho la descarga:

How can I profile my Android app?

En cuanto a la ejecución de códigos frecuentemente, siempre se puede medir el tiempo por sí mismo y escribir los resultados a cabo el archivo de registro. Es un poco laborioso, pero probablemente ya sepa dónde su propio código es potencialmente lento.

+1

Buen punto, supongo que este es un consejo tan obvio que nadie se molestó en sugerir que :-) Además, teniendo en cuenta la fecha de la pregunta, OP no estaba usando GLES2 ya que todavía estaba en desarrollo en ese momento. – JohnEye

0

Esto definitivamente mejorará el rendimiento de tu juego: mantén el tema predeterminado de renderizado todo el tiempo. Aquí hay un tutorialhttp: //www.andengine.org/forums/tutorials/andengine-performance-tip-of-the-day-t810.html

Cuestiones relacionadas