Autor Beitrag
NewNoise
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 08.02.08 15:24 
Hallo,

ich bin neu hier. Also erstmal ein allgemeiner Gruß an alle hier schon anwesenden!

Ich schreibe derzeit ein Viewer-Programm, welches Landkarten darstellt.

Diese Karten soll man entsprechend zoomen können, was auch super funktioniert.
Zunächst habe ich die Karte immer neu gezeichnet (DrawLine), was aber bei einem Volumen von 400TSD Lines ewig dauert.
Dann habe ich die Karte in 10 Zoomstufen gezeichnet und als .png gespeichert.
Der aufruf der ersten zoomstufen (1-5) geht nun auch schnell und toll.

Problematisch wirds danach.

Die Ladezeit steigt exponentiell an, extrem! Dabei dauert das Laden der "größten" zoomstufe ca. 40 sek. obwohl das Bild "nur" 3mb groß ist (10TSDx6TSD px).

Habt ihr eine Idee, wie ich die Ladezeit verkürzen kann?

Die Bitmap-Variable leere ich immer mit Dispose().

Beste Grüße
noise


Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Fr 08.02.2008 um 14:30
golgol
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 58

Win XP Prof. / Linux
C# (VS 2005)
BeitragVerfasst: Mo 11.02.08 11:32 
Ohne jetzt zu wissen, was du für Tools/APIs du nutzt: Zoomen ist im allgemeinen Rechenintensiv und vor allem leidet die Qualität dabei mitunter arg. Die Lösung mit den verschiedenen Kartengrößen ist daher imho die beste Lösung. Das beim Öffnen einer großen Karte die Ladezeit mit der zunehmenden Größe der Karte stark anwächst war dabei leider zu erwarten.
Um die Zeitverzögerung zu minimieren werden daher in solchen Fällen üblicher weise die Karten in Rastern aufgeteilt, sodass die große Gesamtkarte in viele kleine Teilkarten getrennt wird. Die Einzelkarten müssen dann nurnoch einzeln Geladen und entsprechend im Darstellungsbereich positioniert werden - dadurch erhält der Benutzer den Eindruck, dass die Karte zusammengesetzt ist. Wenn du diesen Weg gehst solltest du dir nur gut überlegen, wie groß du die einzelnen Kartenteile machst. Machst du sie zu groß, so ist die Ladezeit wiederum länger und du lädst unnötige Teile der Karte mit. Machst du die Segemente hingegen zu klein, so muss du viele Kapazitäten in die Verwaltung stecken.
NewNoise Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 11.02.08 12:11 
Hallo golgol,

schön, dass man auch hier auf Bielefelder trifft :)

Ja, dass dies die einzige Lösung ist habe ich auch schon fast vermutet.
Ich habe allerdings ehrlich gesagt keine Idee für einen Ansatz.
Wie kann ich denn Abfragen ob eine neue Grafik angezeigt werden soll?
Und was für eine "Raster-Größe" hällst du für sinnvoll?
500*500? Das würde ca. 20*12 Karten ergeben.
Weißt du zufällig, wie "die Großen" das machen, also map24, googlemaps. Auch mit fest gezeichneten Zoomstufen?

Danke schonmal
noise
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 11.02.08 14:21 
user profile iconNewNoise hat folgendes geschrieben:
obwohl das Bild "nur" 3mb groß ist (10TSDx6TSD px).
Im Ram sind es dann allerdings knapp 230 MB.


user profile icongolgol hat folgendes geschrieben:
Zoomen ist im allgemeinen Rechenintensiv und vor allem leidet die Qualität dabei mitunter arg.
Es geht um Vektor-, nicht um Rastergrafiken!

Ich kann mir eigentlich nicht wirklich vorstellen, dass Kartenprogramme (ausgenommen natürlich Webseiten à la Google Maps) die Daten vorrendern. Du hast noch nicht viel über die Daten verraten und das Ganze gehört auch nicht gerade zu meinem Spezialgebiet, aber mit einer hierarchischen Speicherung (Autobahnen>Straßen>Feldwege o.Ä.) und dem ein oder anderen ausgeklügelten Algo (Quad-Tree?) sollte das imHo auch in Echtzeit machbar sein.

Nachtrag:
Mache uns doch bitte die Arbeit nicht noch schwerer und unterlasse in Zukunft das Crossposten in verschiedenen Foren - so steht es auch in den Regeln jenes anderen Forums.
NewNoise Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 28.02.08 13:11 
Hallo,
habe das Problem nun lösen können, indem ich nur den zu betrachtenden Ausschnitt jeweils neu zeichne.
Danke für die Hilfe
noise