我正在开发一个相机应用程序,我在一个覆盖实时预览的小矩形(128x128 pix)中显示预览图像亮度直方图。
有时会发生 ANR,所以我开始使用 traceview 来优化我的代码(我正在即时进行一些图像处理,但它是非常快的 NEON asm 和本机代码,没问题)。
使用 traceview 我发现 Canvas.drawLine() 方法非常慢。我必须在 customView.onDraw() 中每秒更新直方图 30 次,每帧只绘制 128 条线。令人难以置信的是,绘制 128 条线需要 >8% 的 cpu 时间(!!),当整个原生代码操作转换整个帧(720x480 yuv 到 ARGB_8888)需要 <18%
我试图在新的位图画布上绘制直方图,然后将它 drawBitmap() 绘制到视图的画布上,但 drawLine()s 仍然占用大量 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);
}
}
}