2009-11-02 75 views
3

在我的應用程序中,我繪製了一條MapView上的公交路線。這些路線有十幾個和幾百個GPS座標之間的任何地方,描述公交車的路線。Android中更高效的地圖覆蓋

Hosted by imgur.com

我遇到的問題是,一旦我繪製出所有這些行平移/縮放MapView是令人難以置信的慢(甚至點擊「返回」按鈕,只需要一分鐘發生)。

我不知道它是多麼重要,但我把一些調試代碼,然後檢查logcat的輸出和MapView反覆調用Overlaydraw()方法是否有任何改變與否。這種情況每秒發生幾次,並導致大量垃圾回收(每秒2-3 MB)。

有沒有人有任何想法/建議的方法來嘗試和加速?

+0

是否有可能重寫錯誤的方法? [這裏](http://stackoverflow.com/questions/2792263/draw-is-being-constantly-called-in-my-android-map-overlay)你找到了一個很好的主題解釋... – demetrio812 2011-07-23 00:53:01

回答

5

我只使用ItemizedOverlay而不是Overlay,所以這些建議是純粹的猜想。哎呀,我甚至沒有做過2D圖形API。

顯然,最好的答案是讓它一直停止調用draw()。嘗試記錄一些堆棧跟蹤,看看是否可以找出觸發所有draw()調用的內容。例如,在最近的Android Google Groups中,有人注意到Chronometer會導致同一UI中的小部件每秒重繪一次。雖然我可以看到您沒有Chronometer,但您可能能夠找出某些根本原因,但可以更正draw()調用。

假設沒有幫助,我猜測的測試「是否有任何改變或不」是getLatitudeSpan()getLongitudeSpan()getZoomLevel()某種組合,也許其他MapView方法。而且,我假定在每個draw()上,您都在迭代您的GPS點並繪製路線。如果是的話,你可以嘗試:

  1. 當你真的畫,先畫到由Bitmap支持的Canvas,然後在應用BitmapCanvas你上交draw(),並且緩存Bitmap
  2. 跟蹤在最後的draw()中使用的是什麼組合值,如果下一個draw()是相同的,只需重新使用現有的Bitmap即可。否則,請轉到步驟#1,確保釋放位圖(或者重新使用它,如果可能的話)。

我猜測,通過圖形加速,將Bitmap炸到Canvas比遍歷座標和繪製線要便宜。而且,通過緩存Bitmap,您將節省垃圾產生。

無論如何,只是一個想法。

+0

是的。 ..我曾想過要使用可重用的Bitmap路線......它聽起來像工作:)我會看看我是否可以找出爲什麼它不斷重繪。我有點想知道MapView是做了什麼,或者我遇到了問題。顯然我需要做更多的測試。 – 2009-11-03 03:50:21

1

覆蓋類中有兩種繪製方法。一個帶有3個參數,另一個帶有4個參數。你必須用3個參數重寫draw方法。 用4個參數覆蓋該方法會減慢您的應用程序。這正是我發生的事情。看來,互聯網中的例子都出現了同樣的錯誤。