3

我对自定义视图有一些奇怪的性能问题。这是一个简化的示例:

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

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

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

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

到底是怎么回事?为什么将文本稍微超出边界绘制这么慢?

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

4

1 回答 1

1

Skia 可能需要对超出范围的每个字形(字母)进行额外的计算和分配。

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

奇怪的是,我相信相关代码在 SkBounder::doIRectGlyph 周围的 SkDraw.cpp 中。

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

于 2013-10-28T07:55:37.670 回答