2010-12-07 48 views
6

我發現DrawBitMap花費50-60毫秒來繪製三個位圖,其中一個是佔據整個屏幕的矩形,一個是圓形,另一個是路徑。我的位圖是通過使用Canvas.drawPath,drawRect和drawCircle在空白位圖上創建的,Bitmap.Config爲ARGB_8888。 我正在使用ARGB_8888使背景可見以獲得分層效果。 因爲我認爲drawBitmap將是一個非常簡單的操作,所以我驚訝地發現需要花費大約50ms的時間。有人可以指導我是否有任何根本的錯誤,我正在做。下面是我的代碼使用ARGB_8888時的DrawBitMap非常慢使用ARGB_8888

創建空白位圖

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); 
繪製形狀

現在,當我記錄這三個drawBitMap所花費的時間時,我發現它花費了大約50ms。 代碼中是否存在大的時間錯誤。將Bitmap.Config更改爲RGB_565會使時間縮短到8毫秒左右,但後面的背景不可見,並且我在路徑周圍出現一個黑框

回答

2

您應該始終匹配屏幕的格式。最近有一個非常類似的問題,Romain提到如果格式匹配,blits基本上會變成memcpys。當然,確保你沒有使用深奧的blit模式。

此外,如果您不縮放/旋轉任何東西,爲什麼還要使用抗鋸齒?

至於565不工作 - 我只是在瀏覽你的代碼。你在使用Alpha通道嗎?你的位圖是什麼樣的?

+0

是的alpha通道正在使用,因爲我想背景在圖像周圍正確顯示。是的,目標是做旋轉和縮放,所以我正在使用抗鋸齒。基本上我正在設計一個SVG播放器,它執行矢量圖形動畫,以便使用drawPath函數構造位圖,然後在屏幕上爲每幀 – 2010-12-07 10:41:51

6

看起來很正常。 畫布在透明度上非常緩慢。

您可以嘗試切換到OpenGL ES或使用盡可能少的透明度設計您的內容,以便儘可能多地使用RGB_565。

+0

+1繪製位圖。如果你做了很多不平凡的東西(旋轉,縮放,alpha,反鋸齒等),改用OpenGL代替。如果你不這樣做,一定要把它關掉。 – EboMike 2010-12-07 07:24:18

0

其中一位Android開發人員解釋了這個here。要快速繪製ARGB_8888,您需要繪製到32位窗口。查看文章底部的基準。

相關問題