当文本未完全在视图中绘制时,为什么Canvas.drawText会变慢?

时间:2013-08-10 16:10:01

标签: android text canvas android-custom-view

我在自定义视图中遇到了一些奇怪的性能问题。这是一个简化的例子:

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    canvas.drawBitmap(bitmap, 0, 0, null);
    canvas.drawText("test", 0, 30, textPaint);
}

bitmap是一个小背景图片。字符串在顶部绘制,文字大小很大,因此前10个(或左右)像素被裁剪,这就是我想要的。

我在ListView(每行10个)中有大约100个这样的视图。滚动列表非常慢,但由于某些奇怪的原因,如果我更改drawText()坐标以使文本适合视图的边界,它会突然变得平滑。

发生了什么事?为什么在略微超出边界的范围内绘制文本这么慢?

我正在运行Android 4.2.2(无法尝试其他版本,模拟器不适合测试布局性能)。

1 个答案:

答案 0 :(得分:1)

Skia可能需要为每个字形(字母)进行额外的计算和分配。

如果这种情况只是左边或右边的文字不在屏幕上,或者当你有全屏文字并且只有顶部和/或底线是一半可见时,那么这样的性能问题是可以忽略的。但是在你的情况下,你做的比Skia开发人员所假设的更多。对于以后的Android版本,这可能会变得更好,但目前它看起来似乎是一个未被优化的案例。

对于想知道,我相信相关代码在SkDounder :: doIRectGlyph周围的SkDraw.cpp中。

找到这个瓶颈的正确方法是使用本机执行跟踪器,如perf,oprofile或ARM DS-5 Streamline。