Frage

Wir erstellen Grafiken für große datasets.Wir sprechen 4096 samples je Sekunde und 10 Minuten pro Diagramm.Eine einfache Rechnung macht 4096 * 60 * 10 = 2457600 samples pro linegraph.Jede Probe ist ein double (8 bytes) precision FP.Darüber hinaus machen wir mehrere linegraphs auf einem Bildschirm, bis über hundert.Dies macht machen wir über 25M Proben in einem einzigen Bildschirm.Mit gesundem Menschenverstand und einfachen tricks, können wir diesen code performant mit der CPU das zeichnen auf einer 2D-Leinwand.Performant, ist, dass die render-Zeiten fallen unter einer minute. Wie das ist, wissenschaftliche Daten, können wir nicht weglassen, ohne Muster.Im ernst, das ist keine option.Nicht einmal anfangen, darüber nachzudenken.

Natürlich, wir möchten zu verbessern die rendering-Zeiten mit allen Techniken zur Verfügung.Multicore -, pre-rendering-caching sind alle ganz interessant, aber nicht schneiden Sie es.Wir wollen 30FPS Rendern mit dieser Datenbestände mindestens 60FPS bevorzugt.Wir jetzt das ist ein ehrgeiziges Ziel.

Natürliche Weise zu entlasten Grafiken Rendern mit der GPU des Systems.GPU ' s sind auf die Arbeit mit großen Datenmengen und verarbeiten diese parallel.Einige einfache HelloWorld-tests zeigte uns, einen Unterschied von Tag und Nacht in der Geschwindigkeit beim Rendern mit der GPU.

Das problem ist nun:GPU APIs wie OpenGL, DirectX und XNA wurden für Sie 3D-Szenen in den Sinn.So verwenden Sie Sie zum Rendern von 2D-linegraphs ist möglich, aber nicht ideal.Im Beweis der Konzepte, die wir entwickelt haben, den wir festgestellt, dass wir uns transformieren müssen die 2D-Welt in eine 3D-Welt.Suddnely mit dem wir arbeiten müssen und XYZ-Koordinatensystem mit Polygone, Scheitelpunkte und mehr von der Güte.Das ist weit von ideal, aus einer Entwicklungsperspektive.Code wird nicht mehr lesbar ist, ist die Wartung ein Albtraum, und mehr Probleme, aufkochen.

Was wäre Ihr Vorschlag oder eine Idee sein, um dies in 3D?Ist der einzige Weg, dies zu tun, um tatsächlich zu konvertieren, die beiden Systeme (2D-Koordinaten-versus 3D-Koordinaten & Personen)?Oder gibt es eine elegantere Möglichkeit, dies zu erreichen?

-Warum ist es nützlich zu Rendern mehrere samples auf ein pixel? Da es für das dataset besser.Sagen auf einem pixel, Sie haben die Werte 2, 5 und 8.Aufgrund einiger Probe weglassen Algorithmus, nur die 5 gezogen wird.Die Linie würde nur gehen auf 5 und nicht auf 8, damit die Daten verzerrt.Man könnte argumentieren, für das Gegenteil zu, aber die Tatsache der Angelegenheit ist, dass das erste argument zählt für die datasets arbeiten wir mit.Dies ist genau der Grund, warum wir nicht weglassen können Proben.

War es hilfreich?

Lösung

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

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

  2. Sie können alle Arten von Datensätzen in VTK importieren (es gibt Tonnen von Beispielen aus der medizinischen Bildgebung zu den Finanzdaten).

  3. VTK ist ziemlich schnell, und Sie können VTK Grafikpipelines auf mehrere Rechner verteilen, wenn Sie sehr große Visualisierungen tun wollen.

  4. In Bezug auf:

      

    Das macht man über 25M Proben in einem einzigen Bildschirm machen.

         

    [...]

         

    Da diese wissenschaftlichen Daten vorhanden sind, können wir alle Proben nicht auslassen. Im Ernst, ist dies keine Option. Sie auch nicht anfangen, darüber nachzudenken.

Sie können durch Abtasten und unter Verwendung von LOD-Modellen große Datensätze in VTK machen. Das heißt, müssten Sie ein Modell, wo Sie weit eine niedrigere auflösende Version zu sehen, aber wenn Sie in Ihnen heran würde eine höher auflösende Version sehen. Dies ist, wie viele große Daten-Set-Rendering erfolgt.

Sie brauchen keine Punkte von Ihrem aktuellen Datensatz zu beseitigen, aber man kann es sicherlich schrittweise verfeinern, wenn der Benutzer in zoomt. Es tut Ihnen nicht gut 25 Millionen Punkte auf einen einzigen Bildschirm zu machen, wenn der Benutzer kann unmöglich Verarbeitung aller dieser Daten. Ich würde empfehlen, dass Sie sowohl einen Blick auf der VTK-Bibliothek und die VTK Bedienungsanleitung, da dort über Möglichkeiten, einige wertvollen Informationen sind großen Datensätze zu visualisieren.

Andere Tipps

Ich möchte auf Ihre Behauptung äußern, die Sie nicht Proben weglassen können, auf der Rückseite der tgamblin Antwort.

Sie sollten die Daten denken, die Sie den Bildschirm als Sampling Problem sind zu ziehen. Sie sprechen von 2,4M Datenpunkte, und Sie versuchen, dass auf einem Bildschirm zu zeichnen, die nur ein paar tausend Punkte über (zumindest unter der Annahme, ich, dass es ist, weil Sie besorgt sind über 30fps Bildwiederholraten)

Das heißt also, dass für jedes Pixel in der x-Achse Sie in der Größenordnung von 1000 Punkten rendern, die Sie nicht benötigen. Auch wenn Sie den Weg der Nutzung Ihrer gpu nach unten gehen kann (z. B. durch die Verwendung von OpenGL), die noch sehr viel Arbeit ist, dass die GPU für Linien tun muss, die nicht sichtbar sein werden.

Eine Technik, die ich für die Präsentation von Beispieldaten verwendet habe, ist eine Reihe 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-Achse Bildschirmkoordinate.) Sie müssen eine absolute maximal 4 Punkte machen, - das ist die minimale y, max y, ganz linke y und äußerst rechten y . Das wird alle Informationen übertragen, die sinnvollerweise wiedergegeben werden kann. Sie können weiterhin die Minima und Maxima sehen, und Sie die Beziehung zu den benachbarten Pixeln beibehalten.

In diesem Sinne können Sie die Anzahl der Proben auszuarbeiten, die in dem gleichen Pixel in der x-Achse (man denke an sie als Daten „Bins“) fallen. Innerhalb eines bestimmten ist, können Sie dann bestimmen die jeweiligen Proben für Maxima, Minima etc.

Um es zu wiederholen, dass dies nur eine Teilmenge, die für die Anzeige verwendet wird - und ist nur dann sinnvoll, bis die Anzeigeparameter ändern. z.B. wenn der Benutzer die Grafik oder zoomt scrollt, müssen Sie die Renderteilmenge neu zu berechnen.

Sie können dies tun, wenn Sie OpenGL verwenden, aber da opengl ein normiertes Koordinatensystem verwendet (und Sie in Bildschirmkoordinaten realen Welt interessiert sind) Sie ein wenig härter arbeiten müssen, um genau Ihre Daten Bins zu bestimmen. Dies wird erleichtert, ohne OpenGL zu verwenden, aber dann bekommen Sie nicht den vollen Nutzen aus Ihrer Grafikhardware.

Sie wirklich müssen nicht um die Z-Achse Sorge, wenn Sie nicht wollen. In OpenGL (zum Beispiel), können Sie XY Eckpunkte (mit impliziten Z = 0), wiederum von den Z-Buffer angeben, verwenden Sie eine nicht-projektiven Projektionsmatrix und schwupps sind Sie in 2D.

Mark Bessey erwähnt es, dass Sie die Pixel fehlen könnte die Grafik angezeigt werden soll. Aber angesichts Ihre Erklärungen, ich nehme an, Sie wissen, was Sie tun.

OpenGL ist einen orthogonalen Modus hat, die ein z-Koordinate innerhalb (0; 1). Es gibt keine perspektivische Projektion, die Polygone Sie planar auf dem Bildschirm Clipping-Bereich wird zu ziehen.

DirectX wird ähnlich haben. Auf OpenGL, ist es gluOrtho2D ().

genannt

OpenGL ist glücklich 2D zu machen, wenn Sie die Projektion Setup Ortho (kein z) zu sein. Auch sollten Sie Ihre Daten dezimieren. Rendern das gleiche Pixel 1000mal ist eine Verschwendung von GPU. Verbringen Sie Ihre Zeit im Voraus mit einem performat Multi-Thread-Dezimator. Die sicher sein, großen Arrays zu sprengen bei der GPU Vertex Arrays oder Eckpunktpufferspeicher Objekten mit (deutlich Ich bin ein OpenGL irgendwie von Typ)

  

Das macht man über 25M Proben in einem einzigen Bildschirm machen.

Nein, Sie nicht, nicht, wenn Sie einen wirklich sehr groß Bildschirm habe. Da die Bildschirmauflösung ist wahrscheinlich mehr wie 1000 - 2000 Pixel über, sollten Sie wirklich prüfen, um die Daten zu dezimieren, bevor Sie es grafisch darzustellen. Graphische Darstellung von hundert Zeilen mit 1.000 Punkten pro Zeile nicht wahrscheinlich viel von einem Problem, Leistung klug.

Wenn Ihr Code nicht lesbar wird, weil Sie mit dem 3D-Material direkt zu tun haben, müssen Sie eine dünne Schicht Adapter schreiben, das die 3D OpenGL alle Sachen kapselt und nimmt 2D-Daten in einer Form, die für Ihre Anwendung.

Verzeihen Sie mir, wenn ich etwas verpasst habe, und bin Predigen Grundobjektorientiertes Design zum Chor. Gerade Sayin ...

Sie brauchen nicht zu beseitigen, Punkte von Ihrem eigentlichen dataset, aber Sie können sicherlich schrittweise zu verfeinern, wenn der Benutzer zoomt.Es tut dir nicht gut zum Rendern von 25 Millionen Punkte auf einem einzigen Bildschirm, wenn der Benutzer können Sie möglicherweise nicht alle verarbeiten von Daten.Ich würde empfehlen, dass Sie nehmen Sie einen Blick auf sowohl der VTK-Bibliothek und die VTK user guide, da gibt es einige wertvolle Informationen gibt über die Möglichkeiten zur Visualisierung großer Datensätze.

Danke sehr viel.Dies ist genau das, was ich suchte.Es scheint VTK Einsatz von hardware-offload diese Art von rendering, zu.Btw, ich denke mal du meinst wertvolle ;).Zweitens, der Benutzer erhält Informationen von dem Beispiel, das ich gab.Aber nicht wirklich präzise, die Darstellung der Daten kann wirklich pures gold für die Wissenschaftler.Es geht nicht um die Verarbeitung der Daten für den Benutzer, es geht darum, wertvolle Informationen aus dem rendering.Nutzer scheinen dies zu tun, selbst in den sehr 'verkleinert' - Darstellung der dataset.

Weitere Vorschläge?

ich zusätzlich darauf hin wollte, dass VTK zur Verwendung direkt gibt es zwei weitere Produkte auf VTK gebaut, die für Sie von Interesse sein können.

1) Paraview (paraview.org) ist eine Benutzeroberfläche, auf der VTK gebaut, die viel einfacher wissenschaftliche Visualisierung Produkte machen. Sie können alle Daten, die Sie zur Verfügung gestellt möchten machen Sie haben die Hardware es zu handhaben, und es unterstützt MPI für mehrere Prozessoren / Kerne / Clustern. Es ist erweiterbar über Benutzer erstellt Plugins und verwendet automatisierte Tools für das Projekt Gebäude und Compilieren.

2) ParaViewGeo (paraviewgeo.mirarco.org) ist eine Geologie und Bergbau Exploration Ableitung von Paraview von der Firma für die ich arbeite. Es hat eine eingebaute Unterstützung für das Lesen von Dateiformaten, die Paraview nicht, wie GOCAD, Datamine, Geosoft, SGeMS und andere. Noch wichtiger ist, haben wir oft mit anderen Gruppen zusammenarbeiten, die mit einem losen Bindung zu Bergbau lieferbar, wie unsere jüngsten Arbeiten mit einer Gruppe Finite / Discrete-Element-Modellierung tut ein Interesse an den wissenschaftlichen nämlich haben. Es könnte sein, lohnt sich.

In beiden Fällen (PV und PVG) Ihre Daten werden als getrennt von Ihrer Ansicht dieser Daten, und als solche, werden Sie nie „machen“ alle Ihre Daten (da Sie nicht wahrscheinlich einen Monitor würde groß genug zu tun so), aber seien Sie versichert, es wird alles von Ihrem Datensatz verarbeitet „da sein“, wie Sie erwartet. Wenn Sie weitere Filter auf Ihre Daten laufen, nur das, was gesehen werden kann, wird „gemacht“ werden, aber die Filter wird auf alle Ihre Daten berechnen, die, obwohl sie möglicherweise nicht alle auf einmal sichtbar sein, werden alle im Speicher vorhanden sind.

Wenn Sie Zahlen suchen, ich berechnet heute drei regelmäßige Gitter von 8 Millionen Zellen in PVG. Eine enthielt eine 7-Tupel-Vektor-Eigenschaft (7x 8 Millionen Doppelwerte), die anderen beiden jeweils eine skalare Eigenschaft enthalten (1x 8 Millionen Doppelwerte jeweils) für insgesamt 72 Millionen Doppelwerte im Speicher. Ich glaube, der Speicherbedarf zu 500MB nahe war, aber ich hatte auch einen 400.000 Punkt gesetzt, wo jeder Punkt eine 7-Tupel Vektor Eigenschaft hatte und einige anderen verschiedene Daten zur Verfügung als auch.

Nicht sicher, ob dies ist hilfreich, aber könnten Sie die Zeit als dimenion verwenden? das heißt ein Rahmen ist eine z? Das könnte die Dinge klarer, vielleicht? Dann könnten Sie vielleicht effektiv Deltas aufzubauen (das heißt auf z-Achse) das Bild anwenden?

  

Nein, Sie nicht, nicht, wenn Sie einen wirklich, wirklich großen Bildschirm haben. Da die Bildschirmauflösung ist wahrscheinlich mehr wie 1000 - 2000 Pixel über, sollten Sie wirklich prüfen, um die Daten zu dezimieren, bevor Sie es grafisch darzustellen. Graphische Darstellung von hundert Zeilen mit 1.000 Punkten pro Zeile nicht wahrscheinlich viel von einem Problem, Leistung klug.

Zunächst einmal können wir keine Proben weglassen beim Rendern. Das ist unmöglich. Dies würde bedeuten, die Wiedergabe auf die Daten nicht korrekt ist die Grafik auf basiert. Das ist wirklich ein Sperrgebiet. Zeitraum.

Zweitens we sind Rendering alle Proben. Es könnte sein, dass mehrere Proben auf dem gleichen Pixel enden. Aber noch sind wir machen es. Die Probendaten werden auf dem Bildschirm umgewandelt. So wird es gemacht. Man kann die usefullness dieser visualisierten Daten zweifeln, byt Wissenschaftler (unsere Kunden) sind es tatsächlich fordern wir tun es auf diese Weise. Und sie haben einen guten Punkt, IMHO.

Wickeln Sie die Bibliothek in einer sanfteren, kinder 2D-Bibliothek mit der Z und Drehungen alle auf 0 gesetzt.

-Adam

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top