我在我的视野中画了一条相当大的路径,我遇到了一些性能问题.该路径目前长达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);
}
Run Code Online (Sandbox Code Playgroud)
然后在onDraw()
方法中绘制:
canvas.drawColor(Color.WHITE);
canvas.drawPath(dataPath, linePaint);
Run Code Online (Sandbox Code Playgroud)
我测量了使用adb shell dumpsys gfxinfo
和不使用硬件加速来绘制视图所需的时间,令我惊讶的是硬件加速速度要慢得多:
通过硬件加速:
没有硬件加速:
硬件加速版本每帧大约需要200-300毫秒,大多数花费在处理阶段.非加速版本大约需要50 ms,Draw阶段为2/3,处理阶段为1/3.
显然,即使我没有硬件加速的更快版本仍然太慢而无法实现60 fps,或者当我迁移到更大的数据集时甚至几乎无法使用.
在我的情况下,将路径呈现为位图然后仅转换该位图以适合屏幕的想法也存在问题.我需要支持在路径上放大很远,并且在没有路径质量变差的情况下启用放大我将不得不渲染路径的超大位图(并且可能会遇到内存限制和纹理大小限制).当放大远时我不得不创建仅部分路径的新图像,或者切换到仅直接渲染路径,如果性能仍然与我的权限相似,这可能会导致延迟大于帧速率现在.
我现在想知道的是