【发布时间】:2013-02-23 11:10:28
【问题描述】:
在我看来,我正在绘制一条相当大的路径,并且遇到了一些性能问题。该路径目前有 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 毫秒,其中 2/3 在 Draw 阶段,1/3 在 process 阶段。
显然,即使我没有硬件加速的更快版本仍然太慢而无法达到 60 fps,或者当我转移到更大的数据集时甚至几乎无法使用。
在我的情况下,将路径渲染到位图然后仅转换该位图以适应屏幕的想法也是有问题的。我需要支持将路径放大到很远,并且为了在路径质量不变得更差的情况下进行放大,我必须渲染路径的超大位图(并且可能会遇到内存限制和纹理大小限制)。当放大很远时,我要么只创建路径的一部分的新图像,要么切换到直接渲染路径,如果性能仍然与我所拥有的相似,这可能会导致延迟大于帧速率现在。
我现在想知道的是
- 绘制线条/路径只是 GPU 不擅长的事情,不应该尝试硬件加速,还是我可能做错了什么导致性能不佳?
- 我可以做些什么来以可接受的性能绘制如此巨大的路径吗?
【问题讨论】:
-
OpenGL 究竟是如何适应这一点的?
-
硬件加速使用OpenGL,据我了解。但我不确定在那里使用哪个标签。
-
你是怎么画这个的?如果您一次将 1 个点绘制到 GPU 上,那么您可能会获得更差的性能,但如果您将其全部批处理,您应该会看到增加,至少在理论上是这样。
-
@Cort3z 我添加了绘制路径的代码,我正在创建完整的路径,然后一口气绘制它。
-
如果缩小,画128k点真的有用吗?最有可能的是,这些将无法区分。我建议,如果您被缩小,您可以跳过或平均其中一些点。
标签: android graphics opengl-es