Android谷歌地图绘制道路性能发布10.000+;覆盖层
我正在从事一个项目,该项目正在绘制道路并显示有关道路的一些信息。问题是我使用了太多的地质点(5.000-10.000+),将线点绘制为点,并用不同的颜色显示道路,因此地图速度太慢。我对我的应用程序进行了一些配置,但仍然太慢。 你知道如何解决我的问题,让我的表现更好吗 这是我的密码Android谷歌地图绘制道路性能发布10.000+;覆盖层,android,performance,google-maps,map,Android,Performance,Google Maps,Map,我正在从事一个项目,该项目正在绘制道路并显示有关道路的一些信息。问题是我使用了太多的地质点(5.000-10.000+),将线点绘制为点,并用不同的颜色显示道路,因此地图速度太慢。我对我的应用程序进行了一些配置,但仍然太慢。 你知道如何解决我的问题,让我的表现更好吗 这是我的密码 for (int t = 0; t < roads.size(); t++) { for (int i = 0; i < roads.get(t).size() - 1; i++)
for (int t = 0; t < roads.size(); t++) {
for (int i = 0; i < roads.get(t).size() - 1; i++) {
//bounds up-bottom-right-left to draw roads
if (boundBox[0] >= roads.get(t).get(i)
.getLatitudeE6()
&& boundBox[1] >= roads.get(t).get(i)
.getLongitudeE6()
&& boundBox[2] <= roads.get(t).get(i)
.getLatitudeE6()
&& boundBox[3] <= roads.get(t).get(i)
.getLongitudeE6()) {
MyOverlay mOverlay = new MyOverlay();
mOverlay.setColor(Color.GREEN);
mOverlay.setWidth(4);
mOverlay.setPair(roads.get(t).get(i),
roads.get(t).get(i + 1));
mapOverlays.add(mOverlay);
}
}
}
有人可以解决我的问题吗?您可以做一些事情来提高效率 您的第一块代码可以稍微提高效率:
for (int t = 0, size = roads.size(); t < size; t++) { //Avoid calling '.size()' over and over
for (int i = 0; i < roads.get(t).size() - 1; i++) {//Avoid calling '.size()' over and over
final GeoPoint road = roads.get(t).get(i); //Reduce the number of get() calls.
if (boundBox[0] >= road.getLatitudeE6()
&& boundBox[1] >= road.getLongitudeE6()
&& boundBox[2] <= road.getLatitudeE6()
&& boundBox[3] <= road.getLongitudeE6()) {
MyOverlay mOverlay = new MyOverlay();
mOverlay.setColor(Color.GREEN);
mOverlay.setWidth(4);
mOverlay.setPair(road, roads.get(t).get(i + 1));
mapOverlays.add(mOverlay);
}
}
}
有关更多信息,请参阅本文中的“做”和“不做”部分:
这篇文章的相关观点是:“不要在draw方法中创建渲染对象:一个常见的错误是每次调用渲染方法时都创建一个新的绘制或新的路径。这不仅是浪费,迫使系统更频繁地运行GC,而且还绕过了硬件管道中的缓存和优化。”一些关于您如何实施这些5000-10000+的编码将非常有用,因为您可能没有以有效的方式实施它。我也有同样的疑问,有人可以帮助我们吗?谢谢兄弟。干得好。我已经减少了size()和get()方法。我现在不用了。它比旧的快。现在,我在尝试你的建议。又是thx。
for (int t = 0, size = roads.size(); t < size; t++) { //Avoid calling '.size()' over and over
for (int i = 0; i < roads.get(t).size() - 1; i++) {//Avoid calling '.size()' over and over
final GeoPoint road = roads.get(t).get(i); //Reduce the number of get() calls.
if (boundBox[0] >= road.getLatitudeE6()
&& boundBox[1] >= road.getLongitudeE6()
&& boundBox[2] <= road.getLatitudeE6()
&& boundBox[3] <= road.getLongitudeE6()) {
MyOverlay mOverlay = new MyOverlay();
mOverlay.setColor(Color.GREEN);
mOverlay.setWidth(4);
mOverlay.setPair(road, roads.get(t).get(i + 1));
mapOverlays.add(mOverlay);
}
}
}
class MyOverlay extends Overlay {
GeoPoint gp1 = new GeoPoint(0, 0);
GeoPoint gp2 = new GeoPoint(0, 0);
Point p1 = new Point();
Point p2 = new Point();
Path path = new Path();
int colr=0,width=0;
public MyOverlay() {
Paint mPaint = new Paint();
mPaint.setDither(true);
mPaint.setColor(colr);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeWidth(width);
}
public void draw(Canvas canvas, MapView mapv, boolean shadow) {
super.draw(canvas, mapv, false);
path.reset();
Projection projection = mapv.getProjection();
projection.toPixels(gp1, p1);
projection.toPixels(gp2, p2);
path.moveTo((float) p2.x, (float) p2.y);
path.lineTo((float) p1.x, (float) p1.y);
canvas.drawPath(path, mPaint);
}
}