AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung Delphi [Android] Maps Marker ressource schonend laden/verwalten??

[Android] Maps Marker ressource schonend laden/verwalten??

Ein Thema von BBoy · begonnen am 30. Sep 2016 · letzter Beitrag vom 4. Okt 2016
Antwort Antwort
BBoy

Registriert seit: 17. Jan 2007
418 Beiträge
 
Delphi 10 Seattle Professional
 
#1

[Android] Maps Marker ressource schonend laden/verwalten??

  Alt 30. Sep 2016, 10:23
Ich verwende eine Tmaps Karte und lade Marker hinzu aus einer Datenbank.
Derzeit bin ich bei etwa 300 Markern und merke schon wie die App in die Knie geht, also ruckelt... es dauert immer länger bis die Marker geladen sind je mehr es sind. Der normale betrieb der App ist kein Problem aber das Laden macht Probleme.
Wende ich dann einen Filter an, macht sich das richtig bemerkbar.

Ich habe eine ähnliche App aus dem Markt und dort kann man viele hundert Marker einladen ohne das sich das irgendwie bemerkbar macht.

Habt ihr ein paar Tipps was ich tun kannn damit das bei meiner App auch funktioniert?

Hier mal meine Prozedur um die Datenbank zu lesen:
Code:
// Datenbank lesen
procedure TTabbedwithNavigationForm.read_database;
var
  lat, lon : String;
  Position: TMapCoordinate;
begin
  sqlquery1.SQL.Clear;
  SQLQuery1.SQL.Text := 'SELECT * FROM p_marker ORDER BY Min';
  SQLQuery1.Active := true;
  SQLQuery1.First;
  while not SQLQuery1.Eof do begin
    if not SQLQuery1.IsEmpty then begin
      lat := sqlquery1.FieldByName('Lat').Asstring;
      lon := sqlquery1.FieldByName('Lon').Asstring;
      lat := stringreplace(lat,'.',',',[rfReplaceAll]);
      lon := stringreplace(lon,'.',',',[rfReplaceAll]);
      position.Latitude := strtofloat(lat);
      position.Longitude:= strtofloat(lon);

      maxtime := sqlquery1.FieldByName('Min').AsInteger +20;
       if maxtime >60  then
         maxtime := maxtime -60;

      mapview1.BeginUpdate;
      MyMarker := TMapMarkerDescriptor.Create(Position, sqlquery1.FieldByName('Name').Asstring+' :'+format('%.2d',[sqlquery1.FieldByName('Min').Asinteger])+'-'+format('%.2d',[maxtime]));
        MyMarker.Draggable := False;

      if sqlquery1.FieldByName('Type').AsString ='bl' then
          MyMarker.Icon := Image1.Bitmap;
        if sqlquery1.FieldByName('Type').AsString ='rd' then
          MyMarker.Icon := Image2.Bitmap;
        if sqlquery1.FieldByName('Type').AsString ='blu' then
          MyMarker.Icon := Image3.Bitmap;
        if sqlquery1.FieldByName('Type').AsString ='ye' then
          MyMarker.Icon := Image4.Bitmap;
        MyMarker.Visible :=True;
        Fmarkers.Add(MapView1.AddMarker(MyMarker));
        sqlquery1.Next;
    end;
  end;
    mapview1.EndUpdate;
end;
mapview.beginupdate bringt leider nicht den gewünschten erfolg ähnlich bei grid's .
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: [Android] Maps Marker ressource schonend laden/verwalten??

  Alt 30. Sep 2016, 11:20
Lade die Marker Daten erstmal im Thread...

Werden den alle Marker auch angezeigt oder ist ggf. die aktuelle Zoomstufe so, dass 200 Marker nicht in view sind?

Zeige erst die an, die in view und dann nach und nach die anderen setzen.
Somit hast Du einen schnelle Reaktion für den User.

Mavarik
  Mit Zitat antworten Zitat
BBoy

Registriert seit: 17. Jan 2007
418 Beiträge
 
Delphi 10 Seattle Professional
 
#3

AW: [Android] Maps Marker ressource schonend laden/verwalten??

  Alt 30. Sep 2016, 11:25
Das mit dem Thread kann ich mal versuchen. Danke.

Derzeit werden alle Marker geladen und auch angezeigt. Die Zoom-Stufe ist so gesetzt das die meisten auch im View sind.

Zitat:
Zeige erst die an, die in view und dann nach und nach die anderen setzen.
Wie mache ich das?

Ich müsste alle Marker laden und dann innerhalb einer If Schleife abfragen ob der betreffende Marker in View ist. Wenn ja anzeigen, wenn nein dann nicht. Oder?
Ist das dann wirklich schneller? Laden und dann noch die Schleife?

Mit anzeigen ist wahrscheinlich Visible gemeint....
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.610 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: [Android] Maps Marker ressource schonend laden/verwalten??

  Alt 30. Sep 2016, 11:34
Ich kanns mir nicht verkneifen: http://if-schleife.de/
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: [Android] Maps Marker ressource schonend laden/verwalten??

  Alt 30. Sep 2016, 11:35
Ist das dann wirklich schneller? Laden und dann noch die Schleife?
Langsamer als deine Umkonvertierung jedenfalls nicht.

Delphi-Quellcode:
      lat := sqlquery1.FieldByName('Lat').Asstring;
      lon := sqlquery1.FieldByName('Lon').Asstring;
      lat := stringreplace(lat,'.',',',[rfReplaceAll]);
      lon := stringreplace(lon,'.',',',[rfReplaceAll]);
      position.Latitude := strtofloat(lat);
      position.Longitude:= strtofloat(lon);

      maxtime := sqlquery1.FieldByName('Min').AsInteger +20;
       if maxtime >60 then
         maxtime := maxtime -60;
300 Marker aus einer SQLite Datenbank laden wirst Du kaum merken...

und ein

Delphi-Quellcode:
 for i:=0 to High(MarkerArray) do // Edit
   begin
     if MarkerInView(MarkerArray[i])
       then ShowMarker(I)
       else ShowMarkerQueued(I);
   end;
Kostet "garnix"..

Geändert von Mavarik (30. Sep 2016 um 11:38 Uhr)
  Mit Zitat antworten Zitat
nikosophi

Registriert seit: 8. Mai 2013
Ort: Weilerswist
45 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: [Android] Maps Marker ressource schonend laden/verwalten??

  Alt 2. Okt 2016, 19:21

Code:
   while not SQLQuery1.Eof do begin
  ...
      mapview1.BeginUpdate;
BeginUpdate sollte vor das "while", oder?
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: [Android] Maps Marker ressource schonend laden/verwalten??

  Alt 4. Okt 2016, 06:28

BeginUpdate sollte vor das "while", oder?
Das sehe ich genau so...

Und das Format würde ich auch eliminieren.
IMHO ist Format grottenlahm...

Frank
Frank Reim
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz