6

バックグラウンド

地図上にパスを表示するアプリケーション(GoogleマップとOpenStreetマップ)を開発しています。以下の出力例:

道

上記のパスを描くために、私は次のアプローチを使用しています。

private void drawWithoutElevation(Canvas canvas, Projection projection){
    if(rebuildRequired)
        pathBuild();
    else{ //check if path need to be offset
        if(offsetRequired){
            path.offset(offset.x, offset.y);
        }
    }
    canvas.drawPath(path, paint); 
}

上記のアプローチでは、10.000ポイントを描画するのに約1.5ミリ秒かかりますが、これは許容範囲です。

ただし、ポイントの高度に応じて異なる色でパスを表示したいと思います。以下の出力例:

パス2

パスセグメントごとに異なる色を定義する方法が見つからなかったため、次のアプローチを試しました。

アプローチ1

canvas.drawLine()パスの各ポイント間を使用する最も明白な解決策。以下の例:

private void drawWithElevation(Canvas canvas, Projection projection){
    for(int i=1; i<geoArrList.size(); i++){
            paint.setColor(geoArrList.get(i));
            canvas.drawLine(pPrev.x, pPrev.y, p1.x, p1.y, paint);
            pPrev.set(p1.x, p1.y);
        }
    }
}

これにより、同じ10.000ポイントで約80msという非常に残念な時間が発生します。

アプローチ2

高度を個別のステップでセグメント化し、Path高度セグメントの変更ごとに1つずつ、オブジェクトのリストを作成します。以下のコード例:

private void drawWithElevation(Canvas canvas, Projection projection){
    if(rebuildRequired)
        pathBuild();
    for(int i=0; i<pathSegments.size(); i++){
        if(needOffset){
            pathSegments.get(i).path.offset(offsetX, offsetY);
        }
        paint.setColor(pathSegments.get(i).color);
        canvas.drawPath(pathSegments.get(i).path, paint); 
    }
}

これにより、同じ10.000ポイントで約5msの期待外れの時間が少なくなります。

質問

最後のアプローチは、最初のアプローチと比較して大幅な改善を示していますが、さらに改善したいと思います。

より効率的な方法(速度やメモリ使用量)でセグメントごとに異なる色でパスを描画するために使用できる他のアプローチはありますか?

あなたの時間とあなたの助けに感謝します。

4

1 に答える 1

1

いくつかのインスピレーションにつながる可能性があるグーグルによるMyTracksのソースをチェックしてください

于 2012-11-07T18:27:50.170 に答える