He escrito una aplicación simple de Android que dibuja un laberinto utilizando una vista personalizada derivada de SurfaceView
. Sigue el modelo de LunarLander sample application y realiza todos los cálculos y dibujos utilizando una cadena de fondo directamente en el objeto SurfaceHolder
.¿Mejora el rendimiento de la vista personalizada derivada de SurfaceView?
Todo va bien y está funcionando bien para laberintos pequeños/medianos, sin embargo, si configuro el tamaño de la celda laberinto de 8 píxeles, hay muchas celdas en el laberinto en las que la aplicación se arrastra.
El código está haciendo algo que no me gusta porque dibuja todas las células incluso si no ha cambiado y esto es necesario para evitar el parpadeo de la pantalla desde el doble buffer SurfaceView
(en iteraciones previas de la aplicación que estaba dibujando justo lo que cambió y que resultó en un desastre nervioso).
Lo que quiero entonces es la capacidad de usar SurfaceView
, pero sé más selectivo sobre lo que se dibuja. es posible? si no, cuales son las alternativas? ¿Qué hay de mantener un mapa de bits fuera de pantalla, y de forma selectiva dibujar en ese primero?
EDIT: Implementé una combinación fuera de pantalla Bitmap
y Canvas
, escrita por mi máquina de estado accionada por temporizador, dibujando solo aquellas áreas afectadas durante la talla/solución. Luego, simplemente dibuje todo el mapa de bits fuera de pantalla en el SurfaceView
dentro del método run()
y esto ha resuelto mi problema; Puedo reducir el tamaño de la celda a 5 píxeles y el rendimiento es bueno.
Si bien esto es antiguo, un SurfaceView que utiliza el Thread-SurfaceHolder estándar puede especificar un Rect en 'lockCanvas'; cuando esto se hace, solo esa región necesita ser actualizada. En algunas situaciones, puede ahorrar un poco de redibujado pero también requiere administrar la región sucia. –