我在自定义视图中遇到了一些奇怪的性能问题。这是一个简化的例子:
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(无法尝试其他版本,模拟器不适合测试布局性能)。
答案 0 :(得分:1)
Skia可能需要为每个字形(字母)进行额外的计算和分配。
如果这种情况只是左边或右边的文字不在屏幕上,或者当你有全屏文字并且只有顶部和/或底线是一半可见时,那么这样的性能问题是可以忽略的。但是在你的情况下,你做的比Skia开发人员所假设的更多。对于以后的Android版本,这可能会变得更好,但目前它看起来似乎是一个未被优化的案例。
对于想知道,我相信相关代码在SkDounder :: doIRectGlyph周围的SkDraw.cpp中。
找到这个瓶颈的正确方法是使用本机执行跟踪器,如perf,oprofile或ARM DS-5 Streamline。