3

私のアプリでは、MapViewの上にバス路線を描いています。ルートには、バスのルートを表す 10 から数百の GPS 座標が含まれています。

imgur.comが主催

私が抱えている問題は、これらの線をすべて描画すると、パン/ズームMapViewが非常に遅くなることです ([戻る] ボタンをクリックしても 1 分かかります)。

それがどれほど関連性があるかはわかりませんが、デバッグコードをいくつか入れてからlogcat出力をチェックし、何かが変更されたかどうかにかかわらず、オーバーレイのメソッドをMapView繰り返し呼び出しています。これは 1 秒間に数回発生し、大量のガベージ コレクションが発生します (毎秒 2 ~ 3 MB)。draw()

これを試してスピードアップする方法についてのアイデア/提案はありますか?

4

2 に答える 2

5

私は のみを使用ItemizedOverlayし、 は使用していないOverlayため、これらの提案は純粋な推測です。2D グラフィックス API については、ほとんど何もしていません。

明らかに、最善の答えは、draw()常に呼び出しを停止することです。draw()いくつかのスタック トレースをログに記録してみて、すべての呼び出しの原因を特定できるかどうかを確認してください。たとえば、最近 Android の Google グループでChronometer、同じ UI のウィジェットが毎秒再描画されることに気付いた人がいます。を持っていないことがわかりますが、修正できる呼び出しChronometerの根本的な原因を突き止めることができるかもしれません。draw()

それが役に立たないと仮定すると、「何かが変更されたかどうか」のテストは、 、 、 、およびおそらく他の方法の組み合わせであると推測しgetLatitudeSpan()getLongitudeSpan()getZoomLevel()ますMapViewdraw()そして、毎回GPS ポイントを反復処理してルートを描画していると仮定しています。もしそうなら、あなたは試すことができます:

  1. 実際に描画するときは、最初に にCanvas裏打ちされたに描画し、次に、渡された にBitmapを適用し、それをキャッシュします。BitmapCanvasdraw()Bitmap
  2. 最後の で使用された値の組み合わせを追跡しdraw()、次draw()が同じ場合は、既存の を再利用しBitmapます。それ以外の場合は、手順 1 に進み、ビットマップを解放します (可能であれば再利用します)。

グラフィックアクセラレーションを使用すると、座標を繰り返し処理して線を描画するよりも、を爆破する方が安価でBitmapあると推測しています。Canvasまた、 をキャッシュするBitmapことで、ガベージの生成を節約できます。

とにかく、ただの考えです。

于 2009-11-03T01:29:22.640 に答える
1

オーバーレイ クラスには 2 つの draw メソッドがあります。3 つの引数を持つものと 4 つの引数を持つもの。draw メソッドを 3 つの引数でオーバーライドする必要があります。4 つの引数でメソッドをオーバーライドすると、アプリケーションの速度が低下します。これはまさに、私に起こったことです。同じエラーが発生したインターネットの例はどこにあるようです。

于 2012-01-01T15:24:22.920 に答える