2010-12-07 5 views
6

DrawBitMap이 3 비트 맵 그리기에 50-60 밀리 초가 걸린다면, 하나는 전체 화면을 차지하는 사각형이고, 하나는 원이고 다른 하나는 경로입니다. 내 비트 맵은 Bitmap.Config가 ARGB_8888 인 빈 비트 맵에 Canvas.drawPath, drawRect 및 drawCircle을 사용하여 만듭니다. ARGB_8888을 사용하여 레이어 효과를 얻기 위해 배경을 표시합니다. drawBitmap이 매우 간단한 작업이라고 생각하여 약 50ms의 시간이 걸렸다는 사실에 놀라움을 금치 못했습니다. 누군가가 가이드 할 수있는 근본적인 실수가 있습니까? 다음은안드로이드 DrawBitMap 사용시 매우 느림 ARGB_8888

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); 
의 OnDraw 비트 맵 그리기 적절한 비트 맵

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); 

에 도형 그리기

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); 

을 빈 비트 맵 만들기 내 코드

입니다

이제이 3 개의 drawBitMap에 걸리는 시간을 기록합니다. 약 50ms 정도 걸리는 것으로 나타났습니다. 코드에 큰 실수가 있습니까? 비트 맵을 RGB_565로 변경하면 시간이 약 8ms가되지만 배경이 보이지 않고 경로 주위에 검정 상자가 생깁니다.

답변

2

항상 화면의 형식과 일치해야합니다. 최근에 비슷한 질문이있었습니다. Romain은 형식이 일치 할 경우 본질적으로 memcpys로 변합니다. 그리고, 당연히, 비전 블릿 모드를 사용하고 있지 않은지 확인하십시오.

또한 스케일링/회전이없는 경우 왜 앤티 앨리어싱을 사용합니까?

565는 작동하지 않습니다. 저는 코드를 살펴 보겠습니다. 알파 채널을 사용하고 있습니까? 정확히 비트 맵이 어떻게 생겼습니까?

+0

예 이미지 주위에 배경이 제대로 표시되도록하려면 알파 채널을 사용하고 있습니다. 네, 앤티 앨리어싱을 사용하기 때문에 회전 및 축척을 수행하는 것이 목표입니다. 기본적으로 벡터 그래픽 애니메이션을 수행하는 SVG 플레이어를 설계하므로 drawPath 함수를 사용하여 비트 맵을 구성한 다음 비트 맵을 각 프레임 –

6

정상적으로 보입니다. 캔버스의 투명도가 매우 느립니다.

가능한 한 자주 RGB_565를 사용할 수 있도록 OpenGL ES로 전환하거나 가능한 한 투명도를 낮추어 콘텐츠를 디자인 해보십시오.

+0

+1에 대해 화면에 그립니다. (회전, 확대/축소, 알파, 앤티 앨리어스 등) 많은 것을하는 경우 OpenGL을 대신 사용하십시오. 그렇지 않으면 반드시 끄십시오. – EboMike

+0

안녕하세요 mibollma, 투명도는 이미지 주위에서만 필요하므로 배경을 볼 수 있습니다. 이미지는 drawPath를 사용하여 프로그래밍 방식으로 생성되며, 투명도 배경이 이미지 외부에서는 보이지 않지만 이미지 상자 내에서는 보이지 않는 경우를 제외하고는 createBitmap이 사각형 크기를 사용하기 때문에 –

0

Android 개발자 중 한 명이이 here을 설명합니다. ARGB_8888을 빨리 그리려면 32 비트 창에 그려야합니다. 벤치 마크에 대해서는 기사 하단을 참조하십시오.