Cómo dibujar el juego en Android Canvas con un montón de primitivos

Dibujo un montón de rectángulos rectángulos de cada marco en mi juego – es una recreación de un viejo juego electrónico portátil de mano. Los que tenían la exhibición cruda de la matriz de punto para el juego principal y las imágenes de encargo para el texto o algunas imágenes.

Tengo 20×20 grandes "píxeles" en una pantalla de matriz de puntos virtual, también dibujo algunas pantallas de 7 segmentos en la pantalla y algunas otras cosas.

Según TraceView, la mayor parte del tiempo se gasta en los métodos drawLine y drawRectangle, porque simplemente hay demasiados. Dibujo cada "píxel" de la pantalla de matriz de puntos, y cada segmento de 7 segmentos se muestra en cada marco.

Una optimización vino a mi mente, que repintar sólo los píxeles / segmentos que cambiaron, por lo que he guardado el estado anterior de píxeles / segmentos y trató de repintar sólo los cambios. Básicamente es una invalidación cruda.

El comportamiento que yo esperaba era que el Lienzo se quedaría como estaba después de que el último cuadro terminara de pintar, y yo sólo repintaría cosas necesarias.

Por desgracia, mi lienzo estaba parpadeando a negro y de vez en cuando cuando el estado de mi pantalla cambia, sólo píxeles de matriz de puntos / segmentos de parpadeo para un marco. Y me aseguré de que no limpiaran mi lienzo.

Estoy dibujando en un lienzo dentro de un SurfaceView, actualizando Thread, como se describe en Lunar Lander Android muestra. En la muestra Lunar Lander, repintan todo en cada fotograma.

Tal vez podría hacer todo a un mapa de bits en el primer cuadro, a continuación, actualizar ese mapa de bits en cada otro marco?

¿Qué técnica debo usar para mi método paint ()?

SurfaceHolder.unlockCanvasAndPost () realmente hace la página que da vuelta en la superficie, así que incluso si el marco anterior no fue despejado usted conseguiría el 2do más viejo marco, no el que usted dibujó apenas. Y hacer lock () en una superficie instancia un nuevo lienzo cada vez que probablemente está haciendo el clearing en su constructor.

Es mejor dibujar en un mapa de bits como alguien sugerido y, a continuación, drawBitmap en el lienzo cada vez que desea presentar la imagen a la pantalla. Puede adquirir un lienzo desde un mapa de bits para dibujar en él

Y como alguien sugirió (muy ambiguo), puede generar sprites para la matriz de puntos y dibujarlos directamente desde una caché de mapas de bits en lugar de dibujarlos con comandos primitivos. Es decir, para una calculadora de matriz de puntos puede generar todos los 0-9 en 10 mapas de bits y simplemente blit en el lienzo en lugar de llamar a un conjunto de operaciones drawLine / Rect.

Si lo anterior es todavía demasiado lento todavía hay opengl, que aprovecha la aceleración de hardware

¿Por qué no ir a Sprites ?

  • Android dibuja una línea animada
  • Dibujo sobre tema de lona en dispositivos de gama alta
  • Una suave animación de texto muy lenta en un lienzo de Android, SUBPIXEL_TEXT_FLAG no funciona
  • Dibuja animaciones de alta resolución con alta velocidad de fotogramas en Android
  • HTML5 Canvas en teléfonos Android - Redibujar y resaltar problemas
  • ¿Cuándo sincronizo métodos o utilizo bloques sincronizados en mis métodos en un juego de Android?
  • DrawLine problema con Paint.StrokeWidth = 1 en Android
  • Añadir un oyente táctil a imágenes en lienzo girado
  • La ampliación / transformación de lienzo de Android no modifica el área seleccionada
  • HTML5 Lienzo drawImage con fuente de video que no funciona en Android
  • Android: Cómo usar clipRect en API15
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.