2010-12-07 12 views
6

Me parece que DrawBitMap está tardando 50-60 ms en dibujar solo tres mapas de bits, uno es un rectángulo que ocupa la pantalla completa, uno es un círculo y otro es un Camino. Mis bitmaps se crean utilizando Canvas.drawPath, drawRect y drawCircle en un mapa de bits en blanco con Bitmap.Config como ARGB_8888. Estoy usando ARGB_8888 para hacer que el fondo sea visible para obtener un efecto de superposición. Me quedé sorprendido al encontrar que el tiempo necesario era de unos 50 ms, ya que pensé que drawBitmap sería una operación muy simple. ¿Puede alguien guiarme si hay algún error fundamental que estoy cometiendo? Lo que sigue es mi códigoAndroid DrawBitMap muy lento cuando se usa ARGB_8888

Creación de los mapas de bits en blanco

Rectangle = Bitmap.createBitmap(320,480,Bitmap.Config.ARGB_8888); 
Circle = Bitmap.createBitmap(70,70,Bitmap.Config.ARGB_8888); 
Leaf1 = Bitmap.createBitmap(20,30,Bitmap.Config.ARGB_8888); 

Dibujo las formas de la memoria de imagen apropiada

Canvas c = new Canvas(Rectangle); 
Paint p = new Paint(); 
p.setAntiAlias(true); 
p.setColor(0xff6e8b3e); 
c.drawRect(0,0,320,480,p); 

Canvas c = new Canvas(Circle); 
Paint p = new Paint(); 
CirclePath = new Path(); 
p.setAntiAlias(true); 
p.setColor(0xffcd661d); 
System.out.println("x = "+x+" y = "+y); 
CirclePath.addCircle(50,50,10,Path.Direction.CW); 
c.drawPath(CirclePath,p); 

Canvas c = new Canvas(Leaf1); 
Paint paint = new Paint(); 
Path path = new Path(); 
paint.setAntiAlias(true); 
path.moveTo((float)184.37,(float)219.15); 
path.cubicTo((float)188.32,(float)219.15,(float)192.88,(float)220.44,(float)195.62,(float)223.54); 
path.cubicTo((float)197.84,(float)226.05,(float)203.2,(float)229.84,(float)198.18,(float)245.98); 

Dibujo del mapa de bits en OnDraw

canvas.drawBitmap(Rectangle,0,0,p); 
canvas.translate(x,y); // For animation effect 
canvas.drawBitmap(Circle,0,0,p); 
canvas.drawBitmap(Leaf1,0,0,p); 

Ahora cuando grabo el tiempo tomado para este drawBitMap, me parece que está tomando alrededor de 50ms ¿Hay algún error de gran envergadura en el código? Cambiar el Bitmap.Config a RGB_565 reduce el tiempo a alrededor de 8ms pero luego el fondo no es visible y obtengo un recuadro negro alrededor de la ruta

Respuesta

2

Siempre debe coincidir con el formato de su pantalla. Hubo una pregunta muy similar recientemente, y Romain mencionó que las blits esencialmente se convierten en memcpys si el formato coincide. Y, por supuesto, asegúrese de no estar usando un modo de blot esotérico.

Además, ¿por qué está utilizando anti-aliasing si no está escalando/girando nada?

En cuanto a 565 no funciona, solo estoy revisando su código. ¿Estás usando el canal alfa? ¿Cómo se ven exactamente tus mapas de bits?

+0

Sí canal alfa se está utilizando ya que quiero que el fondo se muestre correctamente alrededor de la imagen. Y sí, el objetivo es rotar y escalar también, así que estoy usando anti-aliasing. Básicamente, estoy diseñando un reproductor SVG que hace animación de gráficos vectoriales, por lo que el mapa de bits se construye utilizando funciones drawPath y luego se dibuja un mapa de bits en la pantalla para cada cuadro –

6

Parece normal. El lienzo es muy lento en transparencia.

Puede intentar cambiar a OpenGL ES o diseñar su contenido con la menor transparencia posible para que pueda usar RGB_565 con la mayor frecuencia posible.

+0

+1. Si haces muchas cosas no triviales (rotar, ampliar, alfa, anti-aliasing, etc.), usa OpenGL en su lugar. Si no lo hace, asegúrese de apagarlo. – EboMike

+0

Hola mibollma, la transparencia solo se requiere alrededor de la imagen para que el fondo sea visible. La imagen se crea mediante programación mediante drawPath y desde que createBitmap toma un tamaño rectangular, a menos que especifique que el fondo de transparencia no está visible fuera de la imagen, sino dentro del cuadro de la imagen. –

0

Uno de los desarrolladores de Android explica esto here. Para dibujar ARGB_8888 rápidamente necesita dibujar en una ventana de 32 bits. Ver la parte inferior del artículo para los puntos de referencia.