Android中更高效的地图叠加层

3
在我的应用程序中,我正在在MapView上绘制公交路线。这些路线有十几个到几百个GPS坐标,描述了公交车的行驶路线。
问题是,一旦我绘制出所有这些线路,平移/缩放MapView就会变得非常缓慢(甚至单击“返回”按钮也要花费一分钟的时间)。
我不确定它是否相关,但我添加了一些调试代码,然后检查了logcat输出,发现MapView无论是否有更改都会重复调用Overlaydraw()方法。这种情况每秒钟发生几次,导致大量垃圾收集发生(每秒2-3 MB)。
有人有任何想法/建议可以尝试加快速度吗?

你是否可能覆盖了错误的方法?在这里你可以找到一个关于这个主题的很好的解释... - demetrio812
2个回答

5

我只使用过ItemizedOverlay,没有使用过Overlay,所以这些建议只是纯粹的猜测。实际上,我甚至对2D图形API的应用也不是很熟悉。

显然,最好的解决方案就是让它停止不断地调用draw()。尝试记录一些堆栈跟踪,并查看是否可以找出触发所有draw()调用的原因。例如,在Android Google Groups中,最近有人注意到Chronometer会导致同一UI中的小部件每秒重新绘制。虽然我可以看到你没有Chronometer,但你可能能够找到某些导致draw()调用的根本原因。

假设那并没有帮助,我猜测“是否有任何变化”的测试是一些MapView方法的组合,例如getLatitudeSpan()getLongitudeSpan()getZoomLevel(),可能还有其他方法。我猜测在每次draw()时,您都需要迭代GPS点并绘制路线。如果是这样,您可以尝试:

  1. 当您真正进行绘制时,首先绘制到另一个由Bitmap支持的Canvas上,然后将Bitmap应用于您在draw()中操纵的Canvas上,并缓存该Bitmap
  2. 跟踪上次draw()中使用的值组合,如果下一个draw()是一样的,则只需重复使用现有的Bitmap。否则,请执行步骤#1,确保释放Bitmap(或重新使用它,如果可能)。

我猜测,在图形加速的情况下,将Bitmap贴到Canvas上比迭代坐标并绘制线条更便宜。通过缓存Bitmap,您将节省垃圾生成成本。

总之,这只是一个想法。


是啊...我曾考虑过使用可重用的位图方法...只是听起来很费力 :) 我会看看能否找出为什么它一直在重新绘制。我有点想知道这是否只是MapView所做的,还是我遇到了问题。显然,我需要进行更多测试。 - Jeremy Logan

1
在叠加类中有两种绘制方法。一种是带有3个参数,另一种是带有4个参数。你需要覆盖带有3个参数的绘制方法。 覆盖带有4个参数的方法会减慢你的应用程序。这正是我遇到的问题。似乎在互联网上有很多相同错误的示例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接