在我的应用程序中,我在MapView之上绘制公交路线。这些路线有十几个和几百个GPS坐标,描述了公交车的路线。
我遇到的问题是,一旦我绘制出所有这些平移/缩放行,MapView
非常慢(甚至点击“后退”按钮需要一分钟时间)。
我不确定它有多相关,但是我输入了一些调试代码,然后检查了logcat输出,MapView
重复调用了Overlay的draw()
方法任何事情都发生了变化。这种情况每秒发生几次,导致大量垃圾收集(每秒2-3 MB)。
有没有人对某种尝试加快速度的方法有什么想法/建议?
答案 0 :(得分:5)
我只使用了ItemizedOverlay
,而不是Overlay
,所以这些建议都是纯粹的推测。哎呀,我甚至没有做过2D图形API。
显然,最好的答案是让它一直停止呼叫draw()
。尝试记录一些堆栈跟踪,看看是否可以找出触发所有draw()
调用的内容。例如,最近在Android Google Groups中,有人注意到Chronometer
会导致同一UI中的小部件每秒重绘一次。虽然我可以看到您没有Chronometer
,但您可以找出可以纠正的draw()
来电的一些根本原因。
假设没有帮助,我猜测“是否有任何改变”的测试是getLatitudeSpan()
,getLongitudeSpan()
,getZoomLevel()
和其他{{}}的组合。 {1}}方法。并且,我假设您在每个MapView
上迭代GPS点并绘制路线。如果是这样,你可以尝试:
draw()
支持的Canvas
,然后将Bitmap
应用于Bitmap
Canvas
draw()
},并缓存Bitmap
。draw()
中使用的值组合,如果下一个draw()
相同,则只需重复使用现有的Bitmap
。否则,请转到步骤#1,确保释放位图(或重用它,如果可能的话)。我猜测,通过图形加速,将Bitmap
爆炸到Canvas
比在坐标和绘制线上迭代更便宜。并且,通过缓存Bitmap
,您将节省垃圾生成。
无论如何,只是一个想法。
答案 1 :(得分:1)
覆盖类中有两种绘制方法。一个有3个参数,一个有4个参数。您必须使用3个参数覆盖draw方法。 用4个参数覆盖该方法将减慢您的应用程序。这正是我发生的事情。看来,互联网上的例子在哪里有相同的错误。