我創建了一個線條圖,我原來使用的代碼在繪圖時非常慢,以至於沒用。我用我在網上找到的代碼替換它,它變得更快。我只是好奇爲什麼原始代碼太慢。所有貼在下面的代碼是一個自定義視圖的的onDraw()方法中:算法爲什麼這麼慢?
原始慢碼:
float yStart = 300f;
for (int i=0; i < values.length; i++){
drawPath.moveTo(xStart, yStart);
drawPath.lineTo(xStart+10, values[i]);
drawPath.close();
canvas.drawPath(drawPath, linePaint);
xStart += 10;
yStart = values[i];
}
後來快速的代碼:
float datalength = values.length;
float colwidth = (width - (2 * border))/datalength;
float halfcol = colwidth/2;
float lasth = 0;
for (int i = 0; i < values.length; i++) {
float val = values[i] - min;
float rat = val/diff;
float h = graphHeight * rat;
if (i > 0)
canvas.drawLine(((i - 1) * colwidth) + (horStart + 1) + halfcol, (border - lasth) + graphHeight, (i * colwidth) + (horStart + 1) + halfcol, (border - h) + graphHeight, linePaint);
lasth = h;
我只是不明白爲什麼一個比另一個更有效率。有任何想法嗎?
我懷疑通過運行路徑N個數發生的畫布剪裁是更昂貴的並且可能添加劑以某種方式(每個路徑具有相對於其它路徑(多個)被計算的?)不上的專家路徑的內部,所以我會讓其他人回答。 – Idistic
也許使用'path'繪製'line'效率較低。如果你只在最後,在for循環之後進行繪製,那麼路徑將會很有效率。您是否可以嘗試在for循環之後調用drawPath,並只調用lineTo? –