2010-12-07 139 views
6

DrawBitMapが3つのビットマップを描画するのに50-60msかかるのは、1つがフルスクリーンを占める矩形であり、1つが円であり、もう1つがパスであることです。私のビットマップは、Bitmap.Configが空白のビットマップにCanvas.drawPath、drawRect、drawCircleをARGB_8888として使用して作成されます。 ARGB_8888を使用して、レイヤリング効果を得るために背景を表示させています。 私はdrawBitmapが非常に簡単な操作であると思ったので、約50msと見なして時間がかかることに驚いた。誰かが私が作っている基本的な間違いがあるかと指導することはできますか?以下は、Android DrawBitMapを使用すると非常に遅い

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かかることがわかります コードに大きな間違いがありますか? Bitmap.ConfigをRGB_565に変更すると時間が約8msになりますが、背景は表示されず、パスの周りに黒いボックスが表示されます

答えて

2

常に画面の形式と一致する必要があります。最近、非常によく似た質問がありました。Romainは、形式が一致するとblitsは本質的にmemcpysに変わると述べました。もちろん、難解なblitモードを使用していないことを確認してください。

また、何も拡大/縮小していない場合は、なぜアンチエイリアスを使用していますか?

565が機能していないとして、私はあなたのコードを隠すだけです。アルファチャンネルを使用していますか?正確にあなたのビットマップはどのように見えますか?

+0

はい画像の周りに背景が正しく表示されるように、アルファチャンネルが使用されています。そして、はい、私はアンチエイリアスを使用しているので、回転とスケールを行うことも目的です。基本的に私はベクトルグラフィックスアニメーションを行うSVGプレーヤーを設計しているので、ビットマップはdrawPath関数を使用して構築され、ビットマップはフレームごとに画面に描画されます –

6

通常のようです。 キャンバスの透明度が非常に遅いです。

できるだけ頻繁にRGB_565を使用できるように、OpenGL ESに切り替えようとするか、できるだけ透明性を低くしてコンテンツをデザインしてください。

+0

+1。 (回転、ズーム、アルファ、アンチエイリアスなど)多くの場合、OpenGLを使用してください。そうしない場合は、必ずオフにしてください。 – EboMike

+0

こんにちはmibollma、背景が見えるように画像の周りのみ透明度が必要です。画像は、drawPathを使用してプログラムで作成されます。また、画像の外側ではなく画像ボックス内に透明な背景が表示されない限り、createBitmapは長方形のサイズを取るため –

0

Androidデベロッパーの1人がこのhereについて説明しています。 ARGB_8888をすばやく描画するには、32ビットウィンドウに描画する必要があります。ベンチマークについては、記事の最後を参照してください。

関連する問題