Android DrawBitMap在使用ARGB_8888时速度非常慢

Android DrawBitMap在使用ARGB_8888时速度非常慢,android,Android,我发现DrawBitMap只绘制三个位图需要50-60毫秒,一个是占据全屏的矩形,一个是圆形,另一个是路径。我的位图是在位图.Config为ARGB_8888的空白位图上使用Canvas.drawPath、drawRect和drawCircle创建的。 我使用ARGB_8888使背景可见,以获得分层效果。 我很震惊地发现,当我认为drawBitmap将是一个非常简单的操作时,所花费的时间大约为50毫秒。有没有人能告诉我,我犯了什么根本性的错误。下面是我的代码 < P> 创建空白位图< /强>

我发现DrawBitMap只绘制三个位图需要50-60毫秒,一个是占据全屏的矩形,一个是圆形,另一个是路径。我的位图是在位图.Config为ARGB_8888的空白位图上使用Canvas.drawPath、drawRect和drawCircle创建的。 我使用ARGB_8888使背景可见,以获得分层效果。 我很震惊地发现,当我认为drawBitmap将是一个非常简单的操作时,所花费的时间大约为50毫秒。有没有人能告诉我,我犯了什么根本性的错误。下面是我的代码

< P> <强>创建空白位图< /强>

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);
在适当的位图上绘制形状

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);
在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);
现在,当我记录下这三个绘图位图所用的时间时,我发现它大约需要50毫秒
代码中是否有重大错误。将Bitmap.Config更改为RGB_565会将时间降低到8毫秒左右,但背景不可见,路径周围会出现一个黑框

您应该始终匹配屏幕格式。最近有一个非常类似的问题,Romain提到,如果格式匹配,blit本质上会变成memcpys。当然,还要确保您没有使用深奥的blit模式

另外,如果不缩放/旋转任何对象,为什么要使用抗锯齿

至于565不工作-我只是浏览一下你的代码。你在用阿尔法频道吗?你的位图到底是什么样子的?

看起来很正常。 画布的透明度非常低


您可以尝试切换到OpenGL ES,或者以尽可能低的透明度设计内容,以便尽可能多地使用RGB_565。

一位Android开发者解释了这一点。要快速绘制ARGB_8888,需要绘制到32位窗口。有关基准测试,请参见文章底部。

+1。如果你做了很多琐碎的事情(旋转、缩放、alpha、抗锯齿等等),那就改用OpenGL。如果不需要,请确保将其关闭。嗨,mibollma,透明度仅在图像周围需要,这样背景才可见。图像是使用drawPath以编程方式创建的,并且由于createBitmap采用矩形大小,除非我指定透明背景在图像外部不可见,但在图像框内是alpha通道,因为我希望背景在图像周围正确显示。是的,目标是做旋转和缩放,所以我使用抗锯齿。基本上,我正在设计一个SVG播放器,它可以制作矢量图形动画,所以位图是使用drawPath函数构建的,然后在屏幕上为每一帧绘制位图