私は多くのオーバーレイを含むMapViewを持っています。これに対して、オーバーレイクラスはItemizedOverlayよりも優れたパフォーマンスを持っていると聞いているので、オーバーレイクラスを拡張しました。 マップが移動したり、ズーム、MapActivityにされたとき、私はのみ表示ドローアブルを選択して、私が呼ぶ:オーバーレイを使用したMapViewにはパフォーマンスの問題があります
protected void RefreshOverlay() {
Log.e("||||||||||||||||||||||||||", "RefrashOverlay()");
mapOverlays.clear();
mapOverlays.add(new OverlayElements(zonesP,getApplicationContext()));
}
クラスOverlayElementsオーバーレイを拡張し、ここで私は、すべての図面を実行します。
public void draw(Canvas canvas, MapView mapview, boolean shadow) {
super.draw(canvas, mapview, shadow);
int i;
int sz=zonesP.size();
int style;
ZoneProperties zone;
//paint.setAntiAlias(true);
pp = new Point();
int zoomLevelC=mapview.getZoomLevel();
Projection pr = mapview.getProjection();
for(i=0;i<sz;i++)
{
zone=zonesP.get(i);
if(zone.visible==true)
{
pr.toPixels(zone.point, pp);
xp = pp.x;
yp = pp.y;
if(zone.zoneSizePx<500)
{
//----------
Log.e("zone radious>>",zone.zoneSizePx+"<<");
int alfa;
style=(int)i%2;
Log.e("style>>",i+">>"+r[i]+" "+g[i]+" "+b[i]);
paint.setColor(Color.rgb(r[style],g[style],b[style]));
alfa=(18-zoomLevelC)*35;
if(alfa>255)
alfa = 200;
else
if(alfa<0) alfa = 20;
paint.setAlpha(alfa);
canvas.drawCircle(xp, yp, zone.zoneSizePx, paint);
}
if(zone.select!=0)
if(zone.vState==2)
canvas.drawBitmap(getDrawRes(zone.select,zone.eSizePx),xp,yp,null);
}
//----------------
}
}
この図はそれほど高速ではありません。 ItemizedOverlayに戻す必要がありますか?もしそうなら、どうやって一度だけデータを呼び出すことができますか?どのような最適化の考えですか?ありがとうございました!! :)
まず、アイテムの* all *が用意されているまで、 'ItemizedOverlay'に' populate() 'を呼び出さないでください。次に、Traceviewを使ってあなたの時間がどこに費やされているかを判断し、コードを最適化する方法をよりよく知ることができます。 – CommonsWare
まあ、ええ、私はマップ上に同様のdrawablesを持っているとき、私は一度だけpopulate()を呼び出すが、主に私は異なるものを持っています。私はすでにプロファイラを使用していましたが、ほとんどの場合(マップの移動またはズームで)、BitmapFactory.nativeDecodeAsset、GC、DrawBitmap、GCがあります。ヒントありがとう! :) – Misca
"マップ上に同様のドロウアブルがあるときは、一度しかpopulate()を呼び出しませんが、大部分は別のものがあります" - それは問題ではありません。 – CommonsWare