在我看来,我正在绘制一条相当大的路径,并且遇到了一些性能问题。该路径目前有 32,000 点长,但我的应用程序应该扩展到至少 128,000 点。我真的无法对路径的大小做任何事情,因为数据集就是那么大,我需要能够一次显示整个路径并允许放大。
我正在使用运行 Android 4.2 的 Nexus 10,它默认为未明确禁用它的应用程序启用硬件加速。
该路径是使用以下代码创建的(我省略了一些设置和其他不相关的部分):
dataPath.moveTo(0, offset - (float) data[leftLimit]/ scalingFactor);
for (int i = leftLimit; i < rightLimit; ++i) {
x = (i - leftLimit) * dx;
y = offset - (float) data[i]/ scalingFactor;
dataPath.lineTo(x, y);
}
然后在onDraw()
方法中绘制:
canvas.drawColor(Color.WHITE);
canvas.drawPath(dataPath, linePaint);
adb shell dumpsys gfxinfo
我测量了使用和不使用硬件加速绘制视图所需的时间,令我惊讶的是,硬件加速要慢得多:
使用硬件加速:
没有硬件加速:
硬件加速版本每帧大约需要 200-300 毫秒,大部分时间花在处理阶段。非加速版本大约需要 50 ms,其中 2/3 在 Draw 阶段,1/3 在 process 阶段。
显然,即使我没有硬件加速的更快版本也仍然太慢而无法达到 60 fps,或者当我转移到更大的数据集时甚至几乎无法使用。
将路径渲染到位图然后仅转换该位图以适应屏幕的想法在我的情况下也是有问题的。我需要支持将路径放大到很远,并且为了在路径质量不变得更差的情况下进行放大,我必须渲染路径的超大位图(并且可能会遇到内存限制和纹理大小限制)。当放大很远时,我要么只创建路径的一部分的新图像,要么切换到直接渲染路径,如果性能仍然与我所拥有的相似,这可能会导致延迟大于帧速率现在。
我现在想知道的是
- 绘制线条/路径只是 GPU 不擅长的事情,不应该尝试硬件加速,还是我可能做错了什么导致性能不佳?
- 我能做些什么来以可接受的性能绘制如此巨大的路径吗?