1

私はカメラ アプリに取り組んでいます。ライブ プレビューの上にある小さな四角形 (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);
        }
    }
}
4

3 に答える 3

0

Lines の代わりに Path を使用してみてください。

http://developer.android.com/reference/android/graphics/Path.html

于 2013-08-17T14:59:15.460 に答える