2016-11-22 62 views
12

使用情況時:糟糕表現在CustomView不斷拉

我要畫幾百行和文字對我的看法了幾件。我需要提供滾動效果,爲此我捕獲ACTION_MOVE事件,並用更新的點重新繪製所有行。爲了得到慾望的結果,我嘗試了不同的方法,但都沒有按預期工作。

方法1

我製成,其延伸View的自定義類。所有的繪圖和計算都直接在我的onDraw()方法中完成。由於onDraw()方法的操作太多,所以應用程序的性能非常差。我甚至使用檢查了性能配置文件GPU渲染,我可以看到這些線條非常高。

方法2

我創建了一個位圖,所有的線畫到我的位圖在另一個線程後,我用postInvalidate()繪製位圖onDraw()方法:

mBufferedBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); 
mBufferedBitmap.eraseColor(Color.TRANSPARENT);  
Canvas mBufferedCanvas = new Canvas(mBufferedBitmap);    
drawLines(mBufferedCanvas)  
postInvalidate(); 

因爲我抹去所有先前在位圖上繪製並用更新後的點繪製新線條時,屏幕上會閃爍。

方法3

我試圖延長我的自定義類來SurfaceView並在另一個線程畫布對象執行所有操作。但由於SurfaceView使用CPU進行繪圖操作,因此低配置移動設備的性能會較差。

任何人都可以指導我如何以更好的性能來實現這個任務嗎?

+0

試着看['RenderScript'](https://developer.android.com/guide/topics/renderscript/ compute.html)。我自己並沒有使用這個框架,但是這對於它來說似乎是一個很好的用例。 – Bryan

+0

我的用例不需要RenderScript。 – VijayRaj

+4

不要在'onDraw()'中分配新的位圖,這就是爲什麼你有fps下降。 –

回答

7

有可能使用您的方法1來實現良好的性能。

一個聽起來接近你的用例(繪製線條,一個小文本,並有這些更新的手勢運動)的例子是MPAndroidChart。這是一個開放源碼庫,實現了高性能(見the following comparison如果你想統計)

來檢查類是Renderer類,因爲這些包含在圖表亞型onDraw(Canvas c)代碼平局。您可以看到一些用於實現高性能的技巧:

  1. 不要在渲染循環中分配。相反,在循環外部分配和重用/回收變量。請參閱LineChartRendererline 199
  2. 使用緩衝。例如,在MPAndroidChart中,條形圖中條形的四個角的點將被緩衝,並且緩衝區數組將被重用。請參閱BarBuffer課程。
  3. 使用本機Canvas繪圖功能(drawPathdrawLine等)

優化渲染技巧的完整列表可在Android性能Slow Rendering Guide

2

方法2中找到是最好的一個。如果看到閃爍,則意味着在您擦除所有行之前將位圖繪製爲屏幕。如果是這種情況,請使用另一個位圖並執行雙緩衝:

ScreenBitmap是屏幕上繪製的內容 OffScreenBitmap用於在後臺繪製。

將所有行和文本繪製到OffScreenBitmap,完成後將其複製到ScreenBitmap。在onDraw中的 ,繪製ScreenBitmap。

創建這些位圖一次(通常在onSizeChanged),以便有在onDraw有沒有alloocation