Bresenham畫線演算法
我把每條線的每個點的x,y坐標存到list<Bean>里面
最后list的size達到幾百W,最大會有1000多W
這就導致頻繁GC,容易卡死
拿到所有的點對應的坐標后轉 RGBA_8888的bitmap
然后顯示到ImageView
這是Bresenham畫線演算法
x0,y0線起點的坐標
x1,y1線終點的坐標
private void getPXpoint(int x0, int y0, int x1, int y1) throws OutOfMemoryError {
if (x0 < 0 || x0 > screen_width * 3)
return;
int x = x0;
int y = y0;
int w = x1 - x0;
int h = y1 - y0;
int dx1 = w < 0 ? -1 : (w > 0 ? 1 : 0);
int dy1 = h < 0 ? -1 : (h > 0 ? 1 : 0);
int dx2 = w < 0 ? -1 : (w > 0 ? 1 : 0);
int dy2 = 0;
int fastStep = Math.abs(w);
int slowStep = Math.abs(h);
if (fastStep <= slowStep) {
fastStep = Math.abs(h);
slowStep = Math.abs(w);
dx2 = 0;
dy2 = h < 0 ? -1 : (h > 0 ? 1 : 0);
}
int numerator = fastStep >> 1;
for (int i = 0; i <= fastStep; i++) {
Point point = new Point(x, y);
points.add(point); //把每個點的x,y坐標存起來
numerator += slowStep;
if (numerator >= fastStep) {
numerator -= fastStep;
x += dx1;
y += dy1;
} else {
x += dx2;
y += dy2;
}
}
}
uj5u.com熱心網友回復:
1.用過的點清除了嗎?uj5u.com熱心網友回復:
清除或者置空都用過了
uj5u.com熱心網友回復:
你這是取點速度遠高于畫線速度。。。。可以給list設定最大值,到達最大值時,丟掉一些坐標吧uj5u.com熱心網友回復:
性能問題一般可以通過減少計算復雜度以及增加快取來解決。后者的話你可以復用Point,不要每次都newuj5u.com熱心網友回復:
坐標不能丟的,我 要拿到全部坐標,然后轉RGBA_8888的bitmap
uj5u.com熱心網友回復:
一張bitmap的點能裝下不?uj5u.com熱心網友回復:
點是不斷產生的?如果是的話,讓產生的點存放進佇列,另外一個執行緒取佇列并繪圖,佇列限制大小,生成點大于佇列長度時,先進先出拋棄。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/236249.html
標籤:Android
