Überblick
Mein Programm empfängt einige Datenpunkte (0-400 pro Sekunde).
// simplified example of point's data structure
struct Point {
QPoint p;
QTime t;
quint32 value;
}
- Ich muss einige gefilterte Punkte rendern (zB das
point.time > currentTime-5
undpoint.value>5
). - Ich muss den Datenverlauf speichern (bis zu ~ 50'000 Punkte).
- Die Daten können auch auf der CPU verwendet werden.
- Ich werde die Objektauswahl verwenden.
- Punkte werden in 3d gerendert.
- Die Kameraposition kann sich ändern, aber die Punktedaten sind konstant.
Frage
Was ist die beste Architektur, um diese Art von Problem zu implementieren? Was sind Best Practices für diese Art von Daten und welche Methoden sollten vermieden werden?
Mögliche Lösungen
- Speichern und Filtern von Daten.
- Speichern Sie die Daten auf der CPU (Weltkoordinaten), filtern Sie Daten auf einer CPU und senden Sie gefilterte Daten an VBO. Berechnen Sie dabei die Bildschirmraumkoordinaten mit Shadern.
- Speichern Sie die Daten auf einer CPU und einer GPU (aktualisieren Sie einen VBO, wenn ein neuer Punkt eintrifft).
Filtern Sie Punkte auf der CPU und berechnen Sie Offsets und VerwendungglMultiDrawArrays
. - Speichern Sie die Daten nur auf einer GPU (aktualisieren Sie VBO, wenn der Punkt eintrifft).
Filtern Sie es mit Shadern und holen Sie bei Bedarf Daten von VBO zur CPU.
Lösung 1. ist ziemlich einfach, aber ich denke, es ist eine schlechte Praxis.
Lösung 2. hat Datenvervielfältigung, aber es ist einfach, die Daten zu filtern.
Lösung 3. hat Daten lesen GPU-> CPU.
Ich habe diese Lösungen ausprobiert, und Lösung 2 erscheint mir als die beste, aber es gibt einige Probleme damit:
- Die Multiplikation von Daten muss vorsichtig gehandhabt werden.
- Es ist nicht die am einfachsten zu lesende und zu ändernde Lösung.
- Wenn sich Daten ändern, müssen viele Dinge geändert werden.
Ich habe so etwas wie einen Ringpuffer auf VBO verwendet und Offsets gesendet, um darauf zu rendern.
Umgebung
- OpenGL 3.3
- Qt 5+ Bindungen
- Linux
PS
Ich bin ziemlich neu in Computergrafik und openGL, also hat diese Art von Problem vielleicht sogar ihren Namen. Ich habe meine Implementierungen einige Male geändert, es hat viel Zeit gekostet und ich bin aufgrund seiner Komplexität nicht zufrieden damit. Alle Materialien, Anleitungen und Gedanken sind willkommen.