私はカメラ アプリに取り組んでいます。ライブ プレビューの上にある小さな四角形 (128x128 ピクセル) にプレビュー画像の輝度ヒストグラムを表示しています。
時々 ANR が発生したので、コードを最適化するために traceview を使い始めました (その場で画像操作を行っていますが、NEON asm とネイティブ コードは非常に高速で、問題ありません)。
traceview を使用すると、Canvas.drawLine() メソッドが非常に遅いことがわかりました。customView.onDraw() で毎秒 30 回ヒストグラムを更新する必要があり、フレームごとに 128 行しか描画しません。信じられないことに、フレーム全体 (720x480 yuv から ARGB_8888 へ) を操作変換するネイティブ コード全体の所要時間は 18% 未満ですが、128 行の描画には 8% を超える CPU 時間 (!!) がかかります。
新しいビットマップ キャンバスにヒストグラムを描画してから、ビューのキャンバスに drawBitmap() しようとしましたが、drawLine() はまだ多くの CPU を消費します。
drawLine() を避けるためのアイデアを探しています...
I juts は、128 に正規化された int[128] から小さなヒストグラムを描画する必要があります
これが私のcustomView.onDrawです(多かれ少なかれ...)
@Override
protected void onDraw(Canvas canvas) {
int size = 128;
int y = pos_y + size;
int x;
for(int i=0;i<size;i++) {
if(histogram_data[i]>1) {
x = pos_x+i;
// this is the slow call!!
canvas.drawLine(x, y, x, y-histogram_data[i], paint_histogram);
}
}
}