Есть несколько вещей, которые вы можете сделать для повышения эффективности.
Ваш первый блок кода можно сделать несколько более эффективным:
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);
}
}
}
Но самое главное, самый большой спад производительностиЯ вижу в вашем коде, что вы выделяете новые объекты рендеринга (Paint, Path, Point) каждый раз, когда вызывается draw ().Это может быть реорганизовано, так что вы можете повторно использовать тот же экземпляр Paint:
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);
}
}
Для получения дополнительной информации см. Раздел «Что нужно делать и чего не делать» здесь: http://android -developers.blogspot.com.au/2011/03/android-30-hardware-acceleration.html.
Соответствующий пункт из статьи: «Не создавать объекты рендеринга в методах рисования: распространенная ошибка - создавать новый объект Paint или новый путь при каждом вызове метода рендеринга».. Это не только расточительно, заставляя систему чаще запускать GC, но также обходит кеширование и оптимизацию в аппаратном конвейере. "