2D-Grafik Performante Scatterplots mit J2d oder jOGL

muzzel

Mitglied
Hallo,
ich suche eine Möglichkeit möglichst performant 2d Scatterplots zu rendern, performant im Sinne dass ich sehr viele Punkte gleichzeitig zeichnen muss und trotzdem noch scrollen und zoomen will möglichst ohne dass es ruckelt.

Da Java2d und jOGL beide hardwarebeschleunigte sind werde ich wohl für beide eine kleine Testapplikation schreiben um abhängig von der Zahl der Punkte die Performance zu testen. Wenn mir jemand aber von vorne herein sagen kann dass eine der beiden Möglichkeiten deutlich langsamer ist oder andere gravierende Nachteile mit sich bringt würde mir das einiges an Arbeit ersparen =).

Unabhängig von J2d/jOGL habe ich mir überlegt ob ich durch eine geeignetere Datenstruktur etwas Performance gewinnen kann. Konkret bedeutet das nicht einfach eine Liste mit allen Punkten zu verwalten sondern eine Datenstruktur zu nutzen die z.b. beim Zoomen tatsächlich nur die Punkte aus dem momentan sichtbaren Bereich zeichnet (clipping). Z.b. käme ein Quadtree in Frage.
Nun habe ich aber recht wenig Erfahrung mit Java 2d Engines daher weiss ich nicht ob es eine Möglichkeit gibt z.b. das Bild beim Zoomen/Scrollen nicht komplett neu rendern zu müssen sondern nur den Viewport zu verschieben.

Ein paar Zusatzinformationen: Die Plots sollen später in eine Swing GUI eingebettet werden, ich habe mehrere Jahre Erfahrung mit Java aber habe mich nie mit 2d Grafik beschäftigt. Die Möglichkeit fertige Libraries wie z.b. JFreeChart zu verwenden habe ich verworfen da ich bisher keine gefunden hat die mich zu 100% zufrieden stellt.

Wäre super wenn mir jemand weiterhelfen könnte. Es ist wohl eine recht umfangreiche Fragestellung, ich bin aber gewillt mich entsprechend einzulesen, das Thema erschlägt mich nur etwas daher hatte ich gehofft jemand könnte mir einen Überblick verschaffen =)

lg muzzel
 

Marco13

Top Contributor
Eine konkrete Aussage zur Geschwindigkeit kann ich im voraus auch nicht machen. Nur grob: Swing wird prinzipbedingt nicht schneller sein können als OpenGL, da es ja auf nichts anderem als OpenGL aufbauen kann (DirectX vielleicht, je nach OS, aber DirectX und OpenGL dürften sich bei solchen Sachen nicht viel nehmen).

Bis zu einem gewissen Grad ist diese Frage eigentlich nur am Rande interessant, denn ich behaupte mal ganz frech, dass man praktisch nichts "sinnvoll" darstellen kann, was mit Swing so langsam wäre, dass man mit OpenGL noch nennenswert was rausholen könnte. Was soll das sein? Ein Scatterplot mit mehr als 10000 Punkten hat etwa den selben visuellen Informationsgehalt wie eine Schüssel mit Früchte-Müsli: Bunt, aber unübersichtlich :D

Aber wenn es um Zoomen und ggf. interaktives rum-navigieren und vielleicht auch Animationen geht, könnte das schon wieder etwas anders aussehen. Deswegen würde mich so ein Vergleich trotzdem auch mal interessieren. Das "schwierige" wäre, den Vergleich wirklich objektiv zu machen. Man würde für Swing und OpenGL (ohne im Detail darüber nachgedacht zu haben) an verschiedenen Stellen sicher komplett unterschiedliche Ansätze verwenden - jeweils den, der für die entsprechende API "besser" geeignet ist. Das hängt stark damit zusammen, wie man zeichnet und seine Daten organisiert, und wie viel Funktionalität man Swing/OpenGL überlassen will... Um das Beispiel aufzugreifen: Um's Clipping muss man sich normalerweise nicht soo viele Gedanken machen, denn das meiste davon nimmt einem Swing/OpenGL schon ab - aber speziell bei einem Scatterplot mit 100000 Punkten, wo man auf einen Ausschnit mit 100 Punkten gezoomt hat, könnte es sich doch lohnen, sich was zu überlegen... ob KD-Tree oder Spatial Hashing (und OB sich solche Dinge WIRKLICH lohnen) müßte man genauer untersuchen...


Man kann zumindest ziemlich sicher sagen, dass es deutlich aufwändiger sein wird, das ganze mit JOGL oder LWJGL zu machen. Abgesehen davon, dass 2D-Pixel-Operationen bei den neuesten OpenGL-Versionen afaik ohnehin "deprecated" sind... (glWritePixels und was es da so gab... Aber da weiß Fancy sicher genaueres) schreibt sich in Swing sowas wie
Java:
g.setPaint(someFancyColorfulRadialGradientPaint);
g.fillOval(x,y,w,h);
schon SEHR locker hin, und das in OpenGL umzusetzen könnte tricky sein - und es könnte, egal wie man es macht, kaum für einen (im oben angedeuteten Sinne) objektiven Geschwindigkeitsvergleich herhalten...
 

muzzel

Mitglied
Ist gelöst, ich habe zwei zufriedenstellende Lösungen gefunden, danke an alle Beteiligten.

Falls es noch wen interessiert:

1. Die Punkte in einen JOGL Vertexbuffer speichern und zum scrollen/zoomen den Viewport verändern ist sehr performant, schaffe gut 500k Punkte ohne dass es zu langsam wird.

2. Ich habe ein Image in dem ich vorberechnete ImageData anzeige. Ein Thread im Hintergrund berechnet eben diese ImageDatas und puffert sie. Dabei ist ein ImageData immer ca. drei mal so groß wie der sichtbare Ausschnitt, das sichtbare Bild muss also nicht jedesmal neu berechnet werden wenn gescrollt wird, sondern nur bei großen veränderungen im Viewport (oder Zoomen) gegen ein anderes Bild aus dem Puffer ausgetauscht werden. Performanz dabei ist auch sehr hoch, ca 200k Punkte sind je nach dem wie intensiv man navigiert ohne Probleme möglich. Zum vergleich: ohne vorberechnen von Bildern spürt man ab ca. 30k Punkten schon Performanzeinbusen.

Zu der (berechtigten) Frage warum ich so viele Punkte Plotten will:
Bis zu einem gewissen Grad ist diese Frage eigentlich nur am Rande interessant, denn ich behaupte mal ganz frech, dass man praktisch nichts "sinnvoll" darstellen kann, was mit Swing so langsam wäre, dass man mit OpenGL noch nennenswert was rausholen könnte. Was soll das sein? Ein Scatterplot mit mehr als 10000 Punkten hat etwa den selben visuellen Informationsgehalt wie eine Schüssel mit Früchte-Müsli: Bunt, aber unübersichtlich
Es geht um Datensätze bei denen die meisten Punkte in einem kleinen Gebiet sind aber wenige Punkte ausserhalb liegen. Diese Häufungen werden natürlich auf einem Scatterplot als schwarzer Klumpen auftreten, es geht aber Primär um die wenigen Punkte die einzeln liegen. Ausserdem ist die sichtbare Menge der Punkte durch die Zoomfunktion sehr effizient reduzierbar um auch größere Ansammlungen gut sichtbar zu machen.
 

Ähnliche Java Themen

Neue Themen


Oben