AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI
Thema durchsuchen
Ansicht
Themen-Optionen

RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI

Ein Thema von Redeemer · begonnen am 23. Aug 2017 · letzter Beitrag vom 30. Okt 2018
Antwort Antwort
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.114 Beiträge
 
Delphi 2009 Professional
 
#1

AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI

  Alt 20. Okt 2017, 21:00
(aktuell ist deine GDI only Stategie für mich ne coole simple Basis, um weitere "XY portatble" Sachen daraus abzuleiten und zu testen)
Was meinst du mit XY Portable?
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#2

AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI

  Alt 21. Okt 2017, 10:48
Da es für EmbeddedSysteme(also XY Hardware mit XY Microcontroler mit RealTimeOS oder Hardcore ganz ohne OS) keine aus meiner Sicht portablen(im Sinn von WinGDI kompatibel) und bezahlbaren GrafikLibs gab, hatte ich mir auf Basis der Analyse von Sourcen alter SoftwareOnly WIN-VGA-Treiber und FullSoftware RDP-Sourcen etwas eigenes "80..90% GDI kompatibles" geschrieben, was letztendlich direkt PixelByPixel im QuadBufferd/Switched-HW-Bildschirmspeicher(den es also 4x gibt) arbeitet.

Zu gut deutsch, ich kann in Grenzen den Visualisierungsteil unter Windows auf GDI-Basis entwickeln und nutze dann den "GrafikSourcecode" in meinen EmbeddedSystemen. Vor vielen Jahren war das mit eigener Hardware durchaus noch sinvoll, dann RaspberryPI, nun innendrin billigster AndroidMassenSchrott der ein integriertes Display hat...

Je besser die HW-Basis und das (OS)API(z.B. auch FMX), um so leichter ist der GDI-API-Adapter "rückwärts" jeweils zu realisieren... zum Schluss ist für mich das funktional/logisch dann alles gleich, weil ich überall (m)einen GDI kompatiblen Grafikcode zur Visualisierung einsetzen kann... und da wird es durchaus cool, statt PixelPildern über die meist weiter sehr langsamen Embedded Kommunikationswege dann lieber SVGs zu übertragen, um daraus dann doch "wieder schöne Darstellungen" live zu erzeugen... mir geht es da also hauptsächlich um die Cachespeicher- & Bandbreitenoptimierung, mit Delphi hat das garnix mehr zu tun

(aktuell verfolgen die Leute von "FMXlinux" bei ihrem "CrossVCL" Projekt den exakt gleichen Grundgedanken, nur gehen die mit GDI+ und OpenGL noch viel weiter... die entwickeln ja auch sagen wir für eine Hardwarebasis mit "DesktopCPU&RAM-Power" )

Geändert von mensch72 (21. Okt 2017 um 10:50 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.073 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI

  Alt 23. Okt 2017, 08:32
Zitat:
Ich frage mich gerade, warum zwischen der letzten und der aktuellen Version meiner Unit die Grenze zwischen Eritrea und Äthiopien verschwunden ist (sie fehlt allerdings auch bei anderen SVG-Viewern).
War Eritrea im Jahre 1977 nicht ein Teil von Äthiopien?
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.073 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI

  Alt 23. Okt 2017, 11:05
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;
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.114 Beiträge
 
Delphi 2009 Professional
 
#5

AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI

  Alt 28. Okt 2017, 16:33
Kleine Frage mal an die, die die Klasse benutzen: Mit welchen Delphi-Versionen kompiliert die? Müsst ihr was anpassen?

Zitat:
Ich frage mich gerade, warum zwischen der letzten und der aktuellen Version meiner Unit die Grenze zwischen Eritrea und Äthiopien verschwunden ist (sie fehlt allerdings auch bei anderen SVG-Viewern).
War Eritrea im Jahre 1977 nicht ein Teil von Äthiopien?
Absolut korrekt, danke. Das erklärt's. Dann hat wohl der Ersteller der Karte die entsprechende Grenze mit irgendwas übergekritzelt, was zu der Zeit, als die Grenze da war, noch nicht unterstützt wurde.

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;
Brachte in meinem Test überhaupt selbst mit einer 6 MiB großen SVG-Datei keinen Unterschied, außer dass die EXE 1,5 KiB größer wurde. Gestört hat mich das mit TStringList auch schon. Mich stört auch, dass der String beim Laden aus einem TMemoryStream (was in dem Projekt, wofür ich es benötige, üblich ist) zeitweise dreimal im Speicher ist. TByteStream sah auch Interessant aus, aber ich benutze mit Pos und Copy einige Funktionen, die nur für Strings (genau so) funktionieren.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.073 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI

  Alt 1. Nov 2017, 11:12
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;
Brachte in meinem Test überhaupt selbst mit einer 6 MiB großen SVG-Datei keinen Unterschied, außer dass die EXE 1,5 KiB größer wurde. Gestört hat mich das mit TStringList auch schon. Mich stört auch, dass der String beim Laden aus einem TMemoryStream (was in dem Projekt, wofür ich es benötige, üblich ist) zeitweise dreimal im Speicher ist. TByteStream sah auch Interessant aus, aber ich benutze mit Pos und Copy einige Funktionen, die nur für Strings (genau so) funktionieren.
Jo, mit einer handvoll Millisekunden meinte ich auch wirklich nur so 5 ms.
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.
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.114 Beiträge
 
Delphi 2009 Professional
 
#7

AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI

  Alt 1. Nov 2017, 11:56
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.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.073 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI

  Alt 1. Nov 2017, 12:12
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.
Kannst du das etwas ausführen? So sehr stehe ich im SVG parsen und verarbeiten ja nicht drin.

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?
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:30 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