Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Welche GraphicLib zum Zeichnen von Polygonen? (https://www.delphipraxis.net/188472-welche-graphiclib-zum-zeichnen-von-polygonen.html)

Jacks 7. Mär 2016 15:36

Welche GraphicLib zum Zeichnen von Polygonen?
 
Hallo,

aktuell versuche ich die Performance meiner graphischen Prozesse zu steigern.

In meiner Anwendung möchte ich mehrere Objekte(Polygone) > 100.000 aus einer Datenbank laden und in einer BitMap darstellen.
Aktuell verwende ich hierfür TCanvas. Leider bin ich mit der Rechendauer noch unzufrieden, deshalb würde ich gerne auf eine alternative Methode umsteigen.

Nach längere Suche im Internet bin ich nicht wirklich schlauer geworden, welche GraphicLib sich hierfür am besten eignet.
- Was würdet Ihr empfehlen?
- Gibt es eine GraphicLib die threadsafe ist?

OpenGL
Graphics32
GDI
GDI+
Direct2D Direct3D
DirectX


Grüße Michael

Neutral General 7. Mär 2016 15:54

AW: Welche GraphicLib zum Zeichnen von Polygonen?
 
Nunja im Zweifelsfall sind DirectX und OpenGL quasi dafür gemacht Polygone zu zeichnen.
Kannst du vllt. etwas Code zeigen? Vielleicht kann man aus deinem Code ja auch noch was rausholen.
Wenn du allerdings maximale Geschwindigkeit haben willst solltest du DirectX benutzen schätze ich.

PS: DirectX ist unterteilt in u.a. Direct2D und Direct3D, es ist also quasi dasselbe.

Mavarik 7. Mär 2016 15:55

AW: Welche GraphicLib zum Zeichnen von Polygonen?
 
Zitat:

Zitat von Jacks (Beitrag 1332304)
mehrere Objekte(Polygone) > 100.000 aus einer Datenbank laden und in einer BitMap darstellen.

Polygone 2D->Bitmap? 3D-Projektion->Bitmap?

Zitat:

Zitat von Jacks (Beitrag 1332304)
Gibt es eine GraphicLib die threadsafe ist?

Um was zu erreichen?

Zitat:

Zitat von Jacks (Beitrag 1332304)
DirectX

Doch 3D?

Was hast Du da und was willst Du erreichen?

Neutral General 7. Mär 2016 15:58

AW: Welche GraphicLib zum Zeichnen von Polygonen?
 
Zitat:

Zitat von Mavarik (Beitrag 1332308)
Zitat:

Zitat von Jacks (Beitrag 1332304)
DirectX

Doch 3D?

DirectX heißt nicht zwangsweise 3D.
(Also technisch natürlich schon, aber ohne Z-Koordinaten und entsprechender Kameraeinstellung ist auch da 2D möglich und ggf. auch sinnvoll).

Mavarik 7. Mär 2016 16:01

AW: Welche GraphicLib zum Zeichnen von Polygonen?
 
Zitat:

Zitat von Neutral General (Beitrag 1332311)
Zitat:

Zitat von Mavarik (Beitrag 1332308)
Zitat:

Zitat von Jacks (Beitrag 1332304)
DirectX

Doch 3D?

DirectX heißt nicht zwangsweise 3D.
(Also technisch natürlich schon, aber ohne Z-Koordinaten und entsprechender Kameraeinstellung ist auch da 2D möglich und ggf. auch sinnvoll).

:-) wir spekulieren wieder im Kreis... Warten wir doch auf die Antwort vom TE.

Jens01 7. Mär 2016 16:46

AW: Welche GraphicLib zum Zeichnen von Polygonen?
 
Vulkan fehlt in der Liste noch...:shock:

Jacks 7. Mär 2016 17:24

AW: Welche GraphicLib zum Zeichnen von Polygonen?
 
Im Grunde möchte ich nur 2D Polygone in der BitMap darstellen. Alle Polygone hole ich sequentiell aus meiner Datenbank und lasse sie mit MyCanvas.Canvas.Polygon zeichnen.

Um die Objekte aus der Datenbank zu holen verwende ich bereits Multithreading mit OTL(Omnithreadlibrary) - An der Stelle lässt sich der Code quasi kaum noch verbessern. Im Gegensatz dazu ist Canvas nicht threadsafe. (deshalb die Frage, ob es vll. eine Variante für das Zeichnen gibt, die threadsafe ist)

Über Vulkan muss ich mich erst noch informieren. Höre ich jetzt zum ersten Mal ;).

Delphi-Quellcode:
//Erstellen einer Verbindung zum SQLSERVER
ConnecttoDatabase(server, database, AdoConnection);
...
...
ThreadQuery.SQL.Add(sqlString);
ThreadQuery.open;

while NOT ThreadQuery.Eof do
begin
        //Objekt holen
        RetrieveObjectFromQuery(ThreadQuery, MyDs);
        ThreadQuery.Next;
        //Polygone zeichnen
        PaintSingleObject(MyDs, BMP,   P2RWMatrix,aImageList);
end;

Jacks 7. Mär 2016 17:41

AW: Welche GraphicLib zum Zeichnen von Polygonen?
 
für meine Anwendung ist somit Direct2D sinnvoller als DirectX und Direct3D?

Mavarik 7. Mär 2016 17:43

AW: Welche GraphicLib zum Zeichnen von Polygonen?
 
Immer abwechselnd Daten holen und Malen?

Würde ich nicht machen...

Jacks 7. Mär 2016 18:01

AW: Welche GraphicLib zum Zeichnen von Polygonen?
 
Zitat:

Zitat von Mavarik (Beitrag 1332332)
Immer abwechselnd Daten holen und Malen?

Würde ich nicht machen...

Ja, aktuell hole ich die Daten mit Multithreading aus der Datenbank. Beim Zeichnen der BMP muss ich dann Canvas sperren - An der Stelle warten meine Threads mit den geladenen Daten.

HeZa 7. Mär 2016 19:26

AW: Welche GraphicLib zum Zeichnen von Polygonen?
 
Hm, Du lädst 100.000 Objekte aus der Datenbank und der Show-Stopper ist das Zeichnen auf dem Canvas. Mit anderen Worten, das Laden eines Objekts ist schneller, als das Zeichnen, würde ich so nicht erwarten. Ist das Zeichnen der Objekte so komplex?

Nur mal so für mein Verständnis für die Problematik:
  • Erster Versuch
    Du hast in einem Thread die Datensätze geladen und sofort gezeichnet, da war dann das Laden die Bremse
  • Zweiter Versuch
    Du lädst die Datensätze in mehreren Threads in denen du auch zeichnest, deswegen muss der Canvas gesperrt werden. Jetzt ist das Zeichnen die Bremse.

Gedanken die nicht aus der Erfahrung geboren sind :-)
  • Die Lade-Threads zeichnen nicht
    Sondern sie über geben die zu zeichnenden Objekte einem Zeichnen-Thread (von dem es nur einen gibt). Der Canvas muss nicht mehr gesperrt werden, aber die Übergabe an den Zeichen-Thread muss natürlich Threadsave gestaltet werde.
  • Du teilst deinen Canvas in Kacheln auf
    Jede Kachel hat dann einen eignen Canvas und einen eignen Lade-Thread. Funktioniert nur, wenn Du die Objekte aus der entsprechend sortiert aus der Datenbank abrufen kannst.
  • Jeder Lade-Thread hat einen Speicher-Canvas
    Es wird dann während des Ladens nur im Speicher gezeichnet und zum Schluss alle Canvas gemerged und auf dem Display ausgegeben.

Jens01 7. Mär 2016 19:44

AW: Welche GraphicLib zum Zeichnen von Polygonen?
 
Nochmal zum Malen zurück. Nur damit Mißverständnisse ausgeräumt sind.
So sieht ungefähr das Geschwindigkeitsverhältnis aus:
Canvas < Graphics32 << (DirectX, OpenGL, Vulkan)

Aber auch die Lernkurve. Sprich, die Einarbeitung in DirectX, OpenGL ist viel, viel höher als bei der Canvas-Variante. Vulkan ist ganz neu und soll derzeit noch viel komplizierter sein, aber auch noch etwas schneller.
Ich persönlich halte Graphics32 -obwohl ich mich auch mit OpenGL beschäftige- noch als beste Variante für sowas, aber da gibt es auch sehr unterschiedliche Meinungen.

FarAndBeyond 8. Mär 2016 03:05

AW: Welche GraphicLib zum Zeichnen von Polygonen?
 
Wie sieht es aus mit SDL (Simple DirectMedia Layer, zlib License)...
Läßt sich kombinieren mit OpenGL und Direct3D und unterstützt mehrere Betriebssysteme.
https://www.libsdl.org/

Außerdem wären da noch:

Asphyre Pascal Extended LIB http://asphyre.net/ (MPL)
VampyreImaging LIB http://imaginglib.sourceforge.net/
AGGPas ??

Viel Spass beim Testen.... ;-)

GR32 kann kein Linux oder ???

Jens01 8. Mär 2016 11:24

AW: Welche GraphicLib zum Zeichnen von Polygonen?
 
Zitat:

GR32 kann kein Linux oder ???
Wie?
GR32 kann Lazarus

FarAndBeyond 8. Mär 2016 20:21

AW: Welche GraphicLib zum Zeichnen von Polygonen?
 
Sicher, dafür haben die Jungs und Mädels von GR32 die Bedienungsanleitung für Lazarus auf ihrer Seite....
Auch wenn man das vielleicht nocht toppen könnte, aber es gibt zumindest eine...

Ob das dann jedoch nur auf Windows funzt oder auch auf Linux hab' ich noch nie getestet...

Im Moment hab' ich da keinen Bedarf, aber meine Favoriten sind SDL, Asphyre und Vampyre... Außerdem kombinierbar und Plattformunabhängig, was für die Zukunft generell 'ne gute Idee sein dürfte. Dazu noch OpenGL Header und man ist gut ausgerüstet...

Außer man baut Software ausschließlich für Windows, dann kann man auch gleich nur auf Direct3D/2D setzen...

TiGü 9. Mär 2016 09:21

AW: Welche GraphicLib zum Zeichnen von Polygonen?
 
Für so grundsätzliche Fragen zu Direct2D empfehle ich dieses kostenlose E-Book:
https://www.syncfusion.com/resources...books/direct2d

Man muss zwar ein bisschen überlegen, da die Beispiele mit XAML und C++ gemacht sind, aber die grundsätzliche Herangehensweise für VCL und Delphi ist gleich.

rwalper 9. Mär 2016 10:20

AW: Welche GraphicLib zum Zeichnen von Polygonen?
 
Nur kurz zur Ergänzung: GDI+ ist nicht hardware-beschleunigt und wird es vermutlich nicht werden, DirectX ist hardware-beschleunigt.

DirectX lässt sich leicht und schnell austesten, denn Delphi (ab welcher Version weiß ich aktuell nicht) enthält einen Wrapper für Direct2D. Man braucht nur die Unit Vcl.Direct2D einbinden und die Klasse TDirect2DCanvas nutzen.

Jacks 14. Mär 2016 10:07

AW: Welche GraphicLib zum Zeichnen von Polygonen?
 
Nochmal Danke für die viele Antworten.

Mit HeZas Tipps konnte ich die Zeit schon reduzieren, jedoch bin ich noch nicht ganz zufrieden.
Werde mir mal OpenGL und DirectX genauer anschauen - hoffe ich kann so noch paar Sekunden rausholen :).

Grüße
Michael

Namenloser 14. Mär 2016 10:42

AW: Welche GraphicLib zum Zeichnen von Polygonen?
 
Problem mit OpenGL ist, dass man das Polygon erst mal in Dreiecke zerlegen muss. Das ist im allgemeinen gar nicht so einfach, vor allem wenn das Polygon sich auch selbst schneiden kann (bzw. Löcher haben kann) und der Algorithmus effizient sein soll. Hatte mir dazu vor ein paar Jahren auch mal Gedanken gemacht, ist aber letztlich im Sande verlaufen.

Ob DirectX irgendwelche Funktionen dafür mitbringt, weiß ich nicht.

Neutral General 14. Mär 2016 10:46

AW: Welche GraphicLib zum Zeichnen von Polygonen?
 
Zitat:

Zitat von Namenloser (Beitrag 1332885)
Problem mit OpenGL ist, dass man das Polygon erst mal in Dreiecke zerlegen muss. Das ist im allgemeinen gar nicht so einfach, vor allem wenn das Polygon sich auch selbst schneiden kann und der Algorithmus effizient sein soll.

Also ich hab noch nicht viel mit OpenGL gemacht aber bin mir ziemlich sicher, dass man mit GL_LINE_STRIP/GL_LINE_LOOP (nur Linie) oder GL_POLYGON (ausgefüllt) ohne Probleme ein Polygon zeichnen kann ohne selbst irgendetwas in Dreiecke zerlegen zu müssen.

Namenloser 14. Mär 2016 11:07

AW: Welche GraphicLib zum Zeichnen von Polygonen?
 
Zitat:

Zitat von Neutral General (Beitrag 1332887)
Zitat:

Zitat von Namenloser (Beitrag 1332885)
Problem mit OpenGL ist, dass man das Polygon erst mal in Dreiecke zerlegen muss. Das ist im allgemeinen gar nicht so einfach, vor allem wenn das Polygon sich auch selbst schneiden kann und der Algorithmus effizient sein soll.

Also ich hab noch nicht viel mit OpenGL gemacht aber bin mir ziemlich sicher, dass man mit GL_LINE_STRIP/GL_LINE_LOOP (nur Linie) oder GL_POLYGON (ausgefüllt) ohne Probleme ein Polygon zeichnen kann ohne selbst irgendetwas in Dreiecke zerlegen zu müssen.

GL_POLYGON unterstützt nur konvexe Polygone. Damit ist man sehr stark eingeschränkt.

Jens01 14. Mär 2016 11:21

AW: Welche GraphicLib zum Zeichnen von Polygonen?
 
Hier gibts die Beschreibungen dafür.
Bei Triangle_Fan hatte ich auch schon solche Überlapungen der Triangles.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:47 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