![]() |
AW: Schnelleres laden von PNGs
Immer dieses Rätselraten :wink:
Je genauer Du beschreibst, was Du eigentlich vorhast, desto wahrscheinlicher ist, dass Dir jemand helfen kann. Oder ist das ein Geheimnis? Je nach der Größe einzelner Bilder ist es sinnvoll, diese zu einem großen Bild (Tilemap) zusammenzufassen, das große Bild zu laden und anschließend den entsprechenden Bildausschnitt zu kopieren. Wie werden die einzelnen Bilder angezeigt? In verschiedenen Image-Komponenten oder in einer? Werden die Bilder zufällig ausgewählt, oder ist es absehbar, welche Bilder verwendet werden? |
AW: Schnelleres laden von PNGs
Vielen Dank für die Zahlreichen antworten =)
Zitat:
Zitat:
EDIT: Habs nun nochmal umgeschrieben.
Delphi-Quellcode:
Dannach wird das ganze folgendermaßen Kopiert.
if not Assigned(FPicArray[i - xMin][k - yMin].PngImage) then
begin FPicArray[i - xMin][k - yMin].PngImage := TPNGImage.Create; FPicArray[i - xMin][k - yMin].PngImage.Transparent := false; end; FPicArray[i - xMin][k - yMin].PngImage.LoadFromFile(Path);
Delphi-Quellcode:
Nun kommen wieder die Kunterbunten Bilder, die dann etwa so aussehen:
BitBlt(Map.Canvas.Handle, xCount, yCount, SIZE_TILE, SIZE_TILE,
FPicArray[i][k].PngImage.Canvas.Handle, 0, 0, SRCCOPY); ![]() EDIT2: ![]() Zitat:
Jedoch ist es ehr so das beim Laden der Bilder am meisten performance verloren geht und dies zuerst optimiert werden sollte. Zitat:
Edit: Das Kopieren geschieht mit BitBlt |
AW: Schnelleres laden von PNGs
Mangels realen Daten kann ich es nicht ausprobieren, aber ich würde versuchen, die PNGs direkt zu speichern und mit
![]() |
AW: Schnelleres laden von PNGs
Die Draw Methode ist aber leider nicht so performant wie BitBlt und in diesem Fall, bei dem oft gezeichnet wird, ist es nicht ausreichend.
|
AW: Schnelleres laden von PNGs
Ermittle die Anzahl der CPUs und erstelle entsprechende Threads, die das Einladen erledigen.
|
AW: Schnelleres laden von PNGs
Zitat:
![]() 2 Units einbinden, nichts installieren ... |
AW: Schnelleres laden von PNGs
Vllt. hilft dir auch
![]() Edit: An deiner Stelle würde ich die Images gar nicht umwandeln, sondern so mit den PNG´s weiter arbeiten.... |
AW: Schnelleres laden von PNGs
Zitat:
Zitat:
Ich gehe mal davon aus, daß die Kartenteile auf legalem Weg erstanden wurden und will an dieser Stelle nicht den moralischen Zeigefinger erheben. Dann bietet sich aber auf jeden Fall die Verwendung eines JavaScript-Viewers in Verbindung mit dem WebBrowser an (Google Maps, OpenLayers, ...). Alle diese Lösungen unterstützen auch die Anzeige beliebiger, anwenderdefinierter Bilder. Sie sind zugegebenermaßen nicht die schnellsten (meine reine Delphi-Lösung ist locker um den Faktor 10 schneller), sind aber auch mit relativ geringem Aufwand nutzbar. Willst Du ein ausgereiftes Programm in reinem Delphi - zum Beispiel mit kontinuierlichem Zoom, animierter Verschiebung der Karte per Maus, Overlays (unter transparente PNG's muß auch etwas darunter) und Steuerelemente -, kannst Du einen Entwicklungsaufwand von etlichen Monaten einplanen. Daraus ergeben sich schnell Kosten im 5-stelligen Bereich, wenn's nicht nur aus Spaß an der Freude geschehen soll. Wenn Geld eine untergeordnete Rolle spielt, könntest Du eventuell die Komponente ![]() Dann ist natürlich noch ausschlaggebend, ob deine Lösung plattformübergreifend - also zum Beispiel auch mit FireMonkey - funktionieren soll. Ansonsten würde ich auch die Verwendung von Graphics32 in Verbindung mit Threads als optimale Lösung empfehlen. Wenn Du das allerdings schon so weit hast, würde ich mich sehr für Deine Lösung interessieren... |
AW: Schnelleres laden von PNGs
@Thom
mit WorldTranslation/Transformation ist das ganze doch zu 80% abgefackelt bei quasi keinem Aufwand. |
AW: Schnelleres laden von PNGs
@Bummi
Leider nicht wirklich. Jede Zoomstufe erfordert neue Kacheln, da ja sonst auch alle grafischen Details (Schrift, Straßen usw.) vergrößert bzw. verkleinert werden. Hast Du ganz weit herausgezoomt, bräuchtest Du zum Lesen ein Mikroskop - ansonsten hast Du Text für (fast) Blinde... :cyclops: Dann geht es weiter mit der Verwaltung der Kacheln. Normalerweise kannst Du die Karte horizontal beliebig verschieben (also Dich quasi 199 mal um den Globus drehen) - vertikal ist aber bei rund 80° Schluß. Wurde jetzt eine Karte mit niedriger Zoomstufe x mal um 360° verschoben und anschließend kräftig hineingezoomt, entstehen leicht Zahlen, die schon an die Grenzen von Int64 gehen. Also muß bei der gesamten Koordinatentransformation extrem aufgepaßt werden, damit es zu keinen Überläufen kommt. Bei Zoomstufe 22 handelt es sich um Terrapixelbilder - nur eben in kleine Teile zerlegt. Will man sogar eine animierte Verschiebung der Karte (wie das Wischen auf einem Touchscreen) kommt man schnell in die Verlegenheit, auch noch mit Gleitkommazahlen rechnen zu müssen. Das überfordert dann alle Standardtypen und man muß eigene Typen und Berechnungen dazu entwerfen. Die Kacheln müssen asynchron geladen und angezeigt werden. Das bedeutet Threads in Verbindung mit GDI... Das geht alles, ist auch machbar - aber leider nicht "eben mal so nebenbei". :roll: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz