![]() |
AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI
So kannst du im LoadFromStream eine handvoll Millisekunden sparen:
Delphi-Quellcode:
sl: TStringStream;
begin sl := TStringStream.Create('', TCustomUTF8Encoding.Create); try sl.LoadFromStream(Stream); XML := TRedeemerXML.Create(sl.DataString); finally sl.Free; end; |
AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI
Kleine Frage mal an die, die die Klasse benutzen: Mit welchen Delphi-Versionen kompiliert die? Müsst ihr was anpassen?
Zitat:
Zitat:
|
AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI
Zitat:
Wenn das gesamte Laden und Darstellen so 600 bis 700 ms dauert, ist das natürlich total schnurzpiepe, aber wenn man mit einfachen Mitteln hier optimieren kann...warum nicht? Was du noch mal optimieren kannst wäre die Übergabe von TSVGContext. Das Record mit allen Unter-Records ist ja 184 Byte groß. In den ganzen Handle...-Methoden übergibst du das ja sehr oft (mehrere hundert bis tausend mal) per by-value. Das heißt die 184 Byte werden immer kopiert. Wenn du da deine Klasse optimieren könntest, wären definitiv noch Geschwindigkeitszuwächse zu erwarten. |
AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI
Auch bei Dateien, die 2,5 Sekunden zum Laden brauchen, konnte ich keine Millisekunde Unterschied feststellen.
Der Context muss kopiert werden. In den Handle-Methoden werden Stile geladen, die nur den aktuellen Context (und Unteraufrufe) betreffen und danach wieder rückgängig gemacht werden müssen. |
AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI
Zitat:
Könnte man - jetzt mal nur so theoretisch ins Blaue philosophiert - nicht einfach für jeden Style und/oder Figur (Text, Rect, Circle...) sich den passenden Context vorhalten? Oder wie muss man sich die Zusammenhänge vorstellen? Wenn der Context der in HandleTag übergeben wird und für die einzelnen verschiedenen CurrentTags eh verschieden ist, wäre ein Dictionary mit TSVGContext als class (4 Byte versus 184 Byte) nicht eine Überlegung wert? |
AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI
HTML-Code:
(Ergibt das bunte Windows-Logo.)
<svg width="28" height="28">
<g fill="yellow" stroke="black"> <rect fill="red" x="3" y="3" width="10" height="10" /> <g fill="blue"> <rect fill="green" x="15" y="3" width="10" height="10" /> <rect x="3" y="15" width="10" height="10" /> </g> <rect x="15" y="15" width="10" height="10" /> </g> </svg> Die Standardfüllung von SVG ist schwarz. Die erste Gruppe (g) setzt die Füllung für alle Kindelemente auf gelb und die Kontur auf schwarz. Das erste Rechteck setzt die Füllung auf rot, behält aber die Kontur bei. Nachdem das Rechteck gezeichnet ist, müssen alle Eigenschaften zurückgesetzt werden, die das Rechteck gesetzt hat. Die zweite Gruppe (g) setzt die Füllung für alle Kindelemente auf blau und behält die Kontur bei. Das erste Rechteck setzt die Füllung auf rot, behält aber die Kontur bei. Nachdem das Rechteck gezeichnet ist, müssen alle Eigenschaften zurückgesetzt werden, die das Rechteck gesetzt hat. Das dritte Rechteck (zweites der zweiten Gruppe) wird nun mit der Füllung der Gruppe gezeichnet. Diese wird allerdings sofort danach ebenfalls zurückgesetzt auf die Farbe Gelb der Elterngruppe. Diese wird für das letzte Rechteck benötigt. Nach dem Ende der Gruppe ist die Füllung wieder zurück auf Standard, also schwarz. Der Kontext muss deshalb natürlich auf dem Stapel abgelegt werden. Soweit ich den Vortrag auf den Delphi-Tagen dieses Jahr richtig verstanden habe, wird da von Delphi optimiert, damit keine Dinge kopiert werden, die man nicht schreibt. |
AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI
Verstehe...hm hm hm.
Man könnte so ein Recall-Ansatz versuchen und TSVGContext zur Klasse machen. ![]() Ob das ständige erzeugen und freigeben der Context-Recall-Klasse aber dann weniger zeitintensiv ist als das Kopieren des records...wer weiß?! |
AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI
Wieso sollte ich etwas in TRecall speichern, was ich exakt ein einziges Mal verwende?
|
AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI
Recall würde die Werte der Klasseninstanz von TSVGContext (wenn es dann eine Klasse wird) wieder zurück schreiben, wenn sie in ReadStyle geändert wurden.
Ähnlich wie dem Verwerfen der Änderung auf der lokalen Record-Kopie. Ob das dann am Ende schneller ist als mit record muss natürlich geprüft werden, dass kann ich so auch nicht sehen. |
AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI
Übrigens an der Stelle nochmal Respekt an Redeemer. Ich hatte spaßeshalber mal versucht die DX-Header auf ID2D1DeviceContext5 (
![]() Damit wird zwar die Karte vom Landshut.svg gezeichnet, aber die Texte fehlen. So ganz fertig ist die Microsoft-Implementierung also nicht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:19 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