Grafik-Rendering mit 3D-Beschleunigung

8

Wir erzeugen Graphen für riesige Datensätze. Wir sprechen 4096 Proben pro Sekunde und 10 Minuten pro Graph. Eine einfache Berechnung ergibt 4096 * 60 * 10 = 2457600 Abtastwerte pro Liniengraph. Jedes Sample ist ein Double (8 Bytes) Precision FP. Außerdem rendern wir mehrere Liniendiagramme auf einem Bildschirm, bis zu etwa hundert. Dadurch können wir etwa 25 Millionen Samples auf einem einzigen Bildschirm rendern. Mit dem gesunden Menschenverstand und einfachen Tricks können wir diesen Code performant mit der CPU bekommen, die dies auf einem 2D-Canvas zeichnet. Performant, das sind die Renderzeiten unter einer Minute. Da dies wissenschaftliche Daten sind, können wir keine Beispiele auslassen. Im Ernst, das ist keine Option. Denk nicht mal darüber nach.

Natürlich möchten wir die Renderzeiten mit allen verfügbaren Techniken verbessern. Multicore, Pre-Rendering, Caching sind alle sehr interessant, aber schneiden Sie es nicht. Wir wollen 30FPS Rendering mit diesen Datasets mindestens, 60FPS bevorzugt. Das ist jetzt ein ehrgeiziges Ziel.

Eine natürliche Art, das Grafik-Rendering zu entlasten, ist die Verwendung der GPU des Systems. GPUs arbeiten mit riesigen Datensätzen und verarbeiten sie parallel. Einige einfache HelloWorld-Tests haben uns gezeigt, dass Tag und Nacht Unterschiede in der Rendering-Geschwindigkeit mit der GPU haben.

Jetzt ist das Problem: GPU-APIs wie OpenGL, DirectX und XNA sind für 3D-Szenen gedacht. Daher ist es möglich 2D-Linigraphen zu rendern, aber nicht ideal. Im Beweis der Konzepte, die wir entwickelten, stellten wir fest, dass wir die 2D-Welt in eine 3D-Welt verwandeln müssen. Suddely müssen wir mit XYZ Koordinatensystem mit Polygonen, Ecken und mehr der Güte arbeiten. Das ist aus Entwicklungsperspektive alles andere als ideal. Code wird unlesbar, Wartung ist ein Alptraum, und mehr Probleme kochen auf.

Was wäre Ihr Vorschlag oder Ihre Idee dazu in 3D? Ist das der einzige Weg dies zu tun, um die beiden Systeme (2D-Koordinaten gegen 3D-Koordinaten und -Entitäten) tatsächlich zu konvertieren? Oder gibt es einen schlankeren Weg, dies zu erreichen?

-Warum ist es nützlich, mehrere Samples auf einem Pixel zu rendern? Da es den Datensatz besser darstellt. Sagen Sie auf einem Pixel, Sie haben die Werte 2, 5 und 8. Aufgrund eines Beispielauslassenalgorithmus wird nur die 5 gezeichnet. Die Zeile würde nur auf 5 und nicht auf 8 gehen, daher sind die Daten verzerrt. Sie könnten auch für das Gegenteil argumentieren, aber Tatsache ist, dass das erste Argument für die Datensätze gilt, mit denen wir arbeiten. Dies ist genau der Grund, warum wir Proben nicht auslassen können.

    
user29688 20.10.2008, 20:52
quelle

12 Antworten

5

Ein wirklich populäres Toolkit für die wissenschaftliche Visualisierung ist VTK , und ich denke, es passt zu Ihren Bedürfnissen:

  1. Es ist eine High-Level-API, so dass Sie OpenGL nicht verwenden müssen (VTK baut auf OpenGL auf). Es gibt Schnittstellen für C ++, Python, Java und Tcl. Ich denke, das würde deine Codebasis ziemlich sauber halten.

  2. Sie können alle Arten von Datensätzen in VTK importieren (es gibt unzählige Beispiele aus der medizinischen Bildgebung bis hin zu Finanzdaten).

  3. VTK ist ziemlich schnell, und Sie können VTK-Grafikpipelines auf mehrere Computer verteilen, wenn Sie sehr große Visualisierungen erstellen möchten.

  4. Betreffend:

      

    Damit können wir etwa 25 Millionen Samples auf einem einzigen Bildschirm rendern.

         

    [...]

         

    Da dies wissenschaftliche Daten sind, können wir keine Proben auslassen. Im Ernst, das ist keine Option. Denk nicht mal darüber nach.

Sie können große Datensätze in VTK durch Abtasten und Verwenden von LOD-Modellen rendern. Das heißt, Sie haben ein Modell, in dem Sie eine Version mit niedrigerer Auflösung von weit her sehen, aber wenn Sie heranzoomen, sehen Sie eine Version mit höherer Auflösung. Auf diese Weise wird viel Rendering großer Datasets durchgeführt.

Sie müssen Punkte nicht aus Ihrem tatsächlichen Datensatz entfernen, aber Sie können sie sicher stufenweise verfeinern, wenn der Benutzer hineinzoomt. Es ist nicht gut, 25 Millionen Punkte auf einem einzelnen Bildschirm darzustellen, wenn der Benutzer dies nicht kann verarbeitet all diese Daten. Ich würde empfehlen, dass Sie sich sowohl die VTK-Bibliothek als auch das VTK-Benutzerhandbuch ansehen, da dort einige unschätzbare Informationen zur Visualisierung großer Datensätze vorhanden sind.

    
tgamblin 20.10.2008, 21:09
quelle
6

Ich möchte auf der Rückseite der Antwort von tgamblin auf Ihre Behauptung eingehen, dass Sie keine Beispiele auslassen können.

Sie sollten sich die Daten vorstellen, die Sie als Stichprobenproblem auf den Bildschirm ziehen. Du sprichst von 2,4 Millionen Datenpunkten, und du versuchst, dies auf einen Bildschirm zu ziehen, der nur ein paar tausend Punkte misst (zumindest nehme ich an, dass es so ist, da du dir Sorgen über 30fps Bildwiederholraten machst) / p>

Das bedeutet, dass Sie für jedes Pixel auf der x-Achse in der Größenordnung von 1000 Punkten rendern, die Sie nicht benötigen. Selbst wenn Sie den Weg der Nutzung Ihrer GPU (zB durch die Verwendung von OpenGL) gehen, ist das immer noch eine Menge Arbeit, die die GPU für Linien leisten muss, die nicht sichtbar sein werden.

Eine Technik, die ich verwendet habe, um Beispieldaten zu präsentieren, besteht darin, eine Menge von Daten zu erzeugen, die eine Teilmenge des gesamten Satzes ist, nur für das Rendern. Für ein gegebenes Pixel in der x-Achse (dh eine gegebene x-Achsen-Bildschirmkoordinate) müssen Sie ein absolutes Maximum von 4 Punkten rendern - das ist das minimale y, das maximale y, das linke y und das rechteste y . Dadurch werden alle Informationen wiedergegeben, die sinnvollerweise gerendert werden können. Sie können immer noch die Minima und Maxima sehen, und Sie behalten die Beziehung zu den benachbarten Pixeln bei.

In diesem Sinne können Sie die Anzahl der Samples berechnen, die auf der x-Achse in dasselbe Pixel fallen (denken Sie an Daten als "Bins"). Innerhalb einer gegebenen Bin können Sie dann die einzelnen Stichproben für Maxima, Minima usw. bestimmen.

Noch einmal: Dies ist nur eine Untermenge, die für die Anzeige verwendet wird - und nur so lange, bis sich die Anzeigeparameter ändern. z.B. Wenn der Benutzer das Diagramm scrollt oder zoomt, müssen Sie die Render-Untermenge neu berechnen.

Sie können dies tun, wenn Sie opengl verwenden, aber da opengl ein normalisiertes Koordinatensystem verwendet (und Sie an realen Bildschirmkoordinaten interessiert sind), müssen Sie etwas härter arbeiten, um Ihre Datenbins genau zu bestimmen. Dies wird einfacher sein, ohne OpenGL zu verwenden, aber dann erhalten Sie nicht den vollen Nutzen Ihrer Grafikhardware.

    
Andrew Edgecombe 21.10.2008 22:36
quelle
5

Sie müssen sich wirklich keine Sorgen um die Z-Achse machen, wenn Sie nicht wollen. In OpenGL (zum Beispiel) können Sie XY-Vertices (mit implizitem Z = 0) angeben, den zbuffer drehen, eine nicht-projektive Projektionsmatrix verwenden, und hey presto, dass Sie in 2D sind.

    
Menkboy 20.10.2008 20:58
quelle
3

Mark Bessey hat es erwähnt, dass Ihnen möglicherweise die Pixel fehlen, um den Graphen anzuzeigen. Aber angesichts Ihrer Erklärungen nehme ich an, Sie wissen, was Sie tun.

OpenGL hat einen orthogonalen Modus mit einer z-Koordinate innerhalb (0; 1). Es gibt keine perspektivische Projektion, die Polygone, die Sie zeichnen, sind planar zum Bildschirmausschnitt.

DirectX wird ähnlich sein. Auf OpenGL heißt es gluOrtho2d ().

    
mstrobl 20.10.2008 21:04
quelle
2

OpenGL ist glücklich 2D zu rendern, wenn Sie die Projektion auf Ortho (no z) einstellen. Außerdem sollten Sie Ihre Daten dezimieren. Das gleiche 1000-fache Rendering ist eine Verschwendung von GPU. Verbringen Sie Ihre Zeit im Voraus mit einem performaten Multithread-Dezimator. Seien Sie sicher, große Arrays an der GPU mit Vertex-Arrays oder Vertex-Puffer-Objekte zu sprengen (klar, ich bin ein OpenGL Art von Kerl)

    
basszero 20.10.2008 21:02
quelle
1
  

Damit können wir etwa 25 Millionen Samples in einem einzigen Bildschirm rendern.

Nein, nicht, wenn Sie nicht einen wirklich großen Bildschirm haben. Angesichts der Tatsache, dass die Bildschirmauflösung wahrscheinlich eher 1.000 - 2.000 Pixel beträgt, sollten Sie wirklich überlegen, die Daten zu dezimieren, bevor Sie sie grafisch darstellen. Das Zeichnen von hundert Zeilen bei 1000 Punkten pro Zeile wird wahrscheinlich kein großes Problem sein, was die Leistung betrifft.

    
Mark Bessey 20.10.2008 20:57
quelle
1

Wenn Ihr Code unlesbar wird, weil Sie direkt mit dem 3D-Material zu tun haben, müssen Sie eine dünne Adapterschicht schreiben, die alle 3D-OpenGL-Objekte kapselt und 2D-Daten in einer für Ihre Anwendung geeigneten Form aufnimmt.

>

Verzeiht mir, wenn ich etwas verpasst habe, und predige das grundlegende objektorientierte Design dem Chor. Sag einfach ...

    
comingstorm 20.10.2008 21:15
quelle
1
  

Sie müssen Punkte nicht aus Ihrem tatsächlichen Datensatz entfernen, aber Sie können sie sicher stufenweise verfeinern, wenn der Benutzer hineinzoomt. Es ist nicht gut, 25 Millionen Punkte auf einem einzelnen Bildschirm darzustellen, wenn der Benutzer dies nicht kann verarbeitet all diese Daten. Ich würde empfehlen, dass Sie sich sowohl die VTK-Bibliothek als auch das VTK-Benutzerhandbuch ansehen, da dort einige unschätzbare Informationen zur Visualisierung großer Datensätze vorhanden sind.

Vielen Dank. Genau das habe ich gesucht. Es scheint, VTK verwendet Hardware, um diese Art von Rendering auch zu entladen. Übrigens, ich denke du meinst wertvoll ;). Zweitens erhält der Benutzer Informationen über das Beispiel, das ich angegeben habe. Jedoch nicht wirklich prägnant, die Übersicht der Daten kann wirklich reines Gold für den Wissenschaftler sein. Es geht nicht darum, alle Daten für den Benutzer zu verarbeiten, es geht darum, wertvolle Informationen aus dem Rendering herauszuholen. Benutzer scheinen dies zu tun, selbst in der sehr vergrößerten Darstellung des Datensatzes.

Noch mehr Vorschläge?

    
user29688 20.10.2008 21:17
quelle
1

Ich möchte darauf hinweisen, dass neben der direkten Verwendung von VTK zwei weitere Produkte auf VTK basieren, die für Sie interessant sein könnten.

1) ParaView (paraview.org) ist eine Benutzeroberfläche, die auf VTK basiert und die wissenschaftliche Visualisierung erheblich vereinfacht. Sie können alle Daten rendern, wenn Sie die Hardware dafür benötigen, und MPI für mehrere Prozessoren / Kerne / Cluster. Es ist erweiterbar über Benutzer erstellte Plugins und nutzt automatisierte Tools für das Erstellen und Kompilieren von Projekten.

2) ParaViewGeo (paraviewgeo.mirarco.org) ist ein Geologie- und Bergbauexplorationsderivat von ParaView, das von der Firma produziert wird, für die ich arbeite. Es verfügt über eine integrierte Unterstützung für das Lesen von Dateiformaten, die ParaView nicht unterstützt, z. B. Gocad, Datamine, Geosoft, SGems und andere. Noch wichtiger ist, dass wir oft mit anderen Gruppen zusammenarbeiten, die ein Interesse an wissenschaftlicher Sicht haben, mit einem lose zu bindenden Werk, wie unsere jüngste Arbeit mit einer Gruppe, die Finite / Diskrete Element-Modellierung macht. Es könnte einen Besuch wert sein.

In beiden Fällen (PV und PVG) werden Ihre Daten als getrennt von Ihrer Sicht auf diese Daten angesehen, und Sie werden niemals alle Ihre Daten "rendern" (da Sie wahrscheinlich keinen Monitor haben würden, der groß genug ist, um diese Daten anzuzeigen) tun Sie es), aber seien Sie versichert, dass alles "da sein wird", wie Sie es erwartet haben. Wenn Sie zusätzliche Filter für Ihre Daten ausführen, wird nur das, was gesehen werden kann, "gerendert", aber die Filter berechnen ALLE Daten, die zwar nicht alle gleichzeitig angezeigt werden, aber alle im Speicher vorhanden sind.

Wenn Sie nach Zahlen suchen, habe ich heute drei reguläre Gitter von 8 Millionen Zellen in PVG berechnet. Eine enthielt eine 7-Tupel-Vektoreigenschaft (7 × 8 Millionen Doppelwerte), die anderen beiden enthielten jeweils eine Skalareigenschaft (jeweils 8 Millionen Doppelwerte) für insgesamt 72 Millionen Doppelwerte im Speicher. Ich glaube, der Speicherbedarf lag bei knapp 500 MB, aber ich hatte auch einen Punkt von 400.000 Punkten, wo jeder Punkt eine 7-Tupel-Vektoreigenschaft und einige andere Daten ebenfalls hatte.

    
Chris Cameron 09.12.2008 03:17
quelle
0

Nicht sicher, ob das hilfreich ist, aber könnten Sie die Zeit als Dimension verwenden? ein Rahmen ist ein z? Das könnte die Dinge vielleicht klarer machen? Dann könnten Sie vielleicht effektiv Deltas anwenden, um das Bild aufzubauen (d. H. Auf der Z-Achse)?

    
Egwor 20.10.2008 20:57
quelle
0
  

Nein, nicht, es sei denn, Sie haben einen wirklich großen Bildschirm. Angesichts der Tatsache, dass die Bildschirmauflösung wahrscheinlich eher 1.000 - 2.000 Pixel beträgt, sollten Sie wirklich überlegen, die Daten zu dezimieren, bevor Sie sie grafisch darstellen. Das Zeichnen von hundert Zeilen bei 1000 Punkten pro Zeile wird wahrscheinlich kein großes Problem sein, was die Leistung betrifft.

Zunächst können wir beim Rendern keine Samples auslassen. Das ist unmöglich. Dies würde bedeuten, dass das Rendering für die Daten, auf denen das Diagramm basiert, nicht genau ist. Das ist wirklich ein No-Go-Bereich. Zeitraum.

Zweitens rendern wir alle Samples. Es könnte sein, dass mehrere Samples auf demselben Pixel landen. Aber wir machen es trotzdem. Die Beispieldaten werden auf dem Bildschirm konvertiert. So wird es gerendert. Man kann an der Nützlichkeit dieser visualisierten Daten zweifeln, da Wissenschaftler (unsere Kunden) es tatsächlich verlangen, dass wir es so machen. Und sie haben einen guten Punkt, IMHO.

    
user29688 20.10.2008 21:03
quelle
0

Wickeln Sie die Bibliothek in eine sanftere, benutzerfreundlichere 2D-Bibliothek, wobei Z und Rot alle auf 0 gesetzt sind.

-Adam

    
Adam Davis 20.10.2008 21:04
quelle

Tags und Links