我正在开发相机应用程序,我正在实时预览中覆盖小矩形(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);
}
}
}
答案 0 :(得分:0)
您可以尝试使用Path而不是Lines。
http://developer.android.com/reference/android/graphics/Path.html
答案 1 :(得分:0)
也许您可以在顶部添加新图层,只绘制一次128行,同时保持其他像素透明。