2016-08-30 72 views
2

我有一個比視圖的可見部分更大的Android視圖(例如10000x6000像素),我想在onDraw()中繪製路徑,方法。只有與視口相交的路徑纔會被繪製出來,並且大部分時間都很有效,但是當繪製的路徑的邊界框比視口大得多時,會分配太多的內存並導致應用程序崩潰,導致內存不足錯誤。甚至與剪輯範圍設置爲視口,存儲器被分配用於由所述路徑的邊界框佔據的全部面積:在畫布上繪製比屏幕大得多的路徑時出現內存不足

Large canvas

在上面的示例中,視口是唯一的2000x1400像素,但當所述路徑繪製在畫布上,內存分配爲適合完整路徑(7000x4000像素= 112 MB)。

有沒有辦法限制在這種情況下分配的內存量?

順便說一下,iOS在使用剪輯邊界時限制了渲染柵格圖像的大小。

編輯:看起來就像是一個已知的問題與硬件渲染層:https://code.google.com/p/android/issues/detail?id=24023

+0

我猜你正在使用的OnDraw方法的視圖中繪製的線我將在一個主線程運行,用來刷新查看 – Vijayaramanan

+0

因此,使用具有單獨線程的表面視圖來更新您的視圖將主要在遊戲應用程序中使用表面視圖來繪製圖形 – Vijayaramanan

+0

SurfaceView對於我需要做的事情來說是過量的。並且它不能解決渲染大於屏幕的路徑所需的內存問題。 –

回答

0

我對這個問題的解決方案可能不是最乾淨的,但沒有我需要的東西。我使用了canvas.drawLines,它在每條線之間沒有連接交叉點,但工作很順利。

float[] pathArray = new float[(nodes.size() - 1) * 4]; 
for (int i = 0; i < nodes.size() - 1; i++) { 
    int index = i * 4; 

    Node from = nodes.get(i); 
    pathArray[index] = from.x; 
    pathArray[index + 1] = from.y; 

    Node to = nodes.get(i + 1); 
    pathArray[index + 2] = to.x; 
    pathArray[index + 3] = to.y; 
} 

通過這種方式,我們可以創建我們的「路徑」。

然後將其繪製到畫布上,如下所示;

canvas.drawLines(pathArray, mDefaultPaint); 

正如我所說的結果將被打破線之間的聯繫,但也不會有OOM問題