2012-04-18 19 views
1

私はアプリが描画を完了するのに時間がかかります。私の目標は、ラインを形成するためにa1 []の点を接続することです。これを行うより速い方法がありますか?助けてください!たくさんの線を描画すると、たくさんの線がアンドロイドdrawLinesで描画されます

  > $ for (int i = 0; i < x.length - 1; i++) { 
     >  _canvas.drawLine(a1[i].x, a1[i].y, a1[i + 1].x, a1[i + 1].y,_paint);} 

答えて

0

_canvas.drawPath()を呼び出し、その後、最初のパスを作成してみてください:使用して線を引く

Path p = new Path(); 
p.moveTo(a1[0].x, a1[0].y); 
for (int i = 1; i < x.length; i++) { 
    p.lineTo(a1[i].x, a1[i].y); 
} 
_canvas.drawPath(p, _paint); 
+0

これは良いアイデアですが、違いはありません –

+3

drawPathはCPUを使用しているため遅いです。パスが長すぎると、エラーが発生する可能性があります。 drawLineまたはdrawLinesをハードウェアアクセラレーションで使用する方が効果的です:[このリンクを参照](http://stackoverflow.com/questions/15039829/drawing-paths-and-hardware-acceleration)また、多くの行を描画する場合は、行ポイントの配列を準備してからdrawLinesメソッドを使用する必要があります。これは、drawLineで各単一線分を描画するときに多くの呼び出しではなく、GPUへの呼び出しの1回だけです – Matthias

1

。ライン内の各点は2点のfloat []内の点をパック次いでこれを行う:

カウントポイントのフロート[]内の数字使用可能な長さである
if (count >= 4) { 
    if ((count & 2) != 0) { 
     canvas.drawLines(pointlist, 0, count-2, linePaint); 
     canvas.drawLines(pointlist, 2, count-2, linePaint); 
    } 
    else { 
     canvas.drawLines(pointlist, 0, count, linePaint); 
     canvas.drawLines(pointlist, 2, count - 4, linePaint); 
    } 
} 

。 Drawlinesは1つのセグメントにつき4つの浮動小数点数で表示されますが、そのようなものをずらすと2倍のメモリを無駄にすることなく、結果を得ることができます。

+1

1つのDrawLinesと比較して少し遅いようです –

+0

あなたは何か間違っているより速い。私はそれがソフトウェアだけであれば何でもよいが、ループよりはるかに高速であることを意味する。あなたは線を描くために点を作成するか、実際にそのデータ構造内の点を取得するのが好きですか? – Tatarize

+0

ああ、あなたが一回の呼出しを話しているのを待っている、ええ、それはおそらく半分のスピードでなければならない。それはポイントがはるかに多くのメモリコンパクトであることだけです。あなたはまだ1回の呼び出しではなく2回の呼び出しを行っています。キャンバスへの呼び出しごとに時間がかかります。あなたが記憶を気にしない、または線分が壊れている必要がある場合は、数字を複製してそれを行うのが良いでしょう。 – Tatarize

関連する問題