2012-10-25 21 views
6

TłoPath() - inteligentne kolorowe segmenty

jestem tworzeniem aplikacji, która wyświetla ścieżkę na mapie (Google Maps i OpenStreet Maps). Poniżej przykład wyjściowych:

Path

Aby wyznaczyć ścieżkę powyżej jestem stosując następujące metody:

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

Podejście powyżej trwa około 1,5 ms zwrócić 10000 punktów, co jest do zaakceptowania.

Jednak chcę również pokazać ścieżkę przy użyciu różnych kolorów w zależności od wysokości punktu. Bellow przykład wyjściowa:

Path 2

Ponieważ nie mogłem znaleźć sposób, aby określić inny kolor na segment ścieżki, próbowałem następujących sposobów:

Podejścia 1

Najbardziej oczywiste rozwiązanie, korzystające z canvas.drawLine() pomiędzy poszczególnymi punktami ścieżki. Przykład poniżej:

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

Powoduje to bardzo rozczarowujący czas około 80 ms na te same 10.000 punktów.

Podejście 2

Segment wysokość skokowo i zbudować listę Path obiektów, po jednym na zmianę segmentu wysokościowej. Poniższy przykład kodu:

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

Skutkuje to mniej rozczarowującym czasie około 5ms tych samych 10.000 punktów.

Pytanie

Chociaż ostatnie podejście wykazuje znaczną poprawę w porównaniu do pierwszego, chciałbym dalej poprawić.

Czy istnieje inne podejście, które można wykorzystać do narysowania ścieżki o różnych kolorach na segment w bardziej efektywny sposób (szybkość i/lub użycie pamięci)?

Dziękujemy za poświęcony czas i pomoc.

+0

5ms to 200 fps. Czy na pewno chcesz poprawić wydajność? Jeśli chcesz, aby działała szybciej, ponieważ zamierzasz np. 100k punktów, może czas obniżyć liczbę punktów, pod warunkiem, że jest to ekran smartfona, a nie 4K? – 9000

+0

Dzięki @ 9000, masz dobry punkt ... Sterownik, który próbuje go poprawić, jest to, że użytkownik może dodać kilka ścieżek w tym samym czasie, oprócz kilku innych nakładek (kompas, znaczniki, bieżąca lokalizacja itp.). Być może będę musiał z tym żyć :-) – Luis

Odpowiedz

1

Sprawdź źródło MyTracks by google, które może prowadzić do pewnej inspiracji.