2012-03-15 30 views
1

我上一個項目,該項目是aboot繪製道路和顯示有關的道路信息的一些工作。問題是,我使用這麼多geopoints(5.000-10.000 +)和描畫線點至點並顯示出不同顏色的道路,所以在地圖太慢。我做了一些關於我的應用程序的配置,但仍然太慢。 你有關於解決我的問題,是表現更好的任何想法?Android的谷歌地圖繪製performanse問題道路上10.000+覆蓋

這裏是我的代碼。

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); 
       } 
      } 
     } 

class MyOverlay extends Overlay { 

      GeoPoint gp1 = new GeoPoint(0, 0); 
      GeoPoint gp2 = new GeoPoint(0, 0); 
      int colr=0,width=0; 



      public MyOverlay() { 

      } 

      public void draw(Canvas canvas, MapView mapv, boolean shadow) { 
       super.draw(canvas, mapv, false); 

       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); 

       Point p1 = new Point(); 
       Point p2 = new Point(); 

       Path path = new Path(); 

       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.drawBitmap(markerBitmap, point.x, point.y, null); 

       canvas.drawPath(path, mPaint); 
       //canvas.drawBitmap(bitmap, src, dst, paint); 

      } 

      public void setPair(GeoPoint gpone, GeoPoint gptwo) { 

       gp1 = gpone; 
       gp2 = gptwo; 

      } 

      public void setColor(int clr) 
      { 
       colr=clr; 
      } 

      public void setWidth(int w) 
      { 
       width=w; 
      } 


     } 

是否有任何人來解決我的問題?

+0

你是如何實現這些5000-10000 +將是有益的一些編碼,因爲也許您沒有有效的方式 – 2012-03-16 00:04:08

+0

實現它,我添加的代碼。 – Tugrul 2012-03-16 00:14:36

+0

我有這個相同的疑問,有人能幫幫我們嗎? – digulino 2012-05-02 19:51:52

回答

3

有幾件事情可以做,以提高工作效率。

你的代碼的第一個塊可以作出稍微更高效:

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); 
     } 
    } 
} 

但最重要的,最大的性能負擔,我可以在你的代碼中看到的是,你分配一個新的渲染對象(油漆,路徑,Point)每次調用draw()。這可重構,所以你重複使用相同的漆實例:

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或一個新的Path。只是浪費,迫使系統更頻繁地運行GC,它也繞過了硬件管道中的緩存和優化。「

+0

感謝兄弟。做得好。我縮小了size()和get()方法。我現在不使用它們。它比舊的更快。現在,我正在嘗試您的建議。 thx再次。 – Tugrul 2012-05-09 08:21:41