Android drawLine替代性能改进

时间:2013-08-17 14:54:53

标签: android performance canvas

我正在开发相机应用程序,我正在实时预览中覆盖小矩形(128x128像素)的预览图像亮度直方图。

有时ANR发生了,所以我开始使用traceview来优化我的代码(我正在动态进行一些图像处理,但它非常快速的NEON asm和原生代码,没有问题)。

使用traceview我发现Canvas.drawLine()方法非常慢。我必须在customView.onDraw()中每秒更新直方图30次,每帧只绘制128行。令人难以置信的是,绘制128行需要大约8%的CPU时间(!!),当整个本机代码进行操作 - 将整个帧(720x480 yuv转换为ARGB_8888)转换为<18%

我试图在新的位图画布上绘制直方图,然后将drawBitmap()绘制到视图的画布上,但drawLine()仍然需要大量的CPU。

我正在寻找避免drawLine()的想法......

我必须从标准化为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);
        }
    }
}

2 个答案:

答案 0 :(得分:0)

您可以尝试使用Path而不是Lines。

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

答案 1 :(得分:0)

也许您可以在顶部添加新图层,只绘制一次128行,同时保持其他像素透明。