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.
- Checkin si se presiona dentro de rectF en onTouchEvent
- Mala mirada del texto en lona
- Android: anima el alfa de la única ruta en un lienzo
- Android: ¿Desplazando eficientemente el contenido de una lona?
- El botón flotante de Android no se muestra
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 ()?
- Cambiar el color en Paint and Canvas en Android
- ¿Botón de dibujo de Android a la lona con la opinión de encargo?
- Configuración de varios elementos personalizados en MultiAutoCompleteTextView: Android
- Cómo borrar el dibujo anterior en lienzo?
- Android gl abierto más lento que la tela?
- Cómo calcular el porcentaje de área borrada de un mapa de bits en android?
- Escala de lona y mantenimiento de centro
- Chartv Donut desaparece
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 ?