Verwaltungsystem für Render-Aufgaben

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Antworten
Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Verwaltungsystem für Render-Aufgaben

Beitrag von cloidnerux » So Nov 15, 2009 7:19 pm

Ich Arbeite unter C# an einem 2D-CAD Programm.
Jetzt setehe ich vor folgendem Problem:
Wie schaffe ich ein System, das mir das Rendern von Bestimmten Objekten ermöglicht, ohne 60 mal in der Sekunde Tausende Klassen und Funktionen durchlaufen lasse?
Bisher hatte ich 2 Ansätze:
Kommandoqueue:
Ich lege eine Queue an, in dem ich eine Klasse ablege, die einen Funktionspointer, LifeTime und id enthält.
Bei dem Paint Ereignis des OpenGL Fensters wird diese Queue durchgelesen und die betreffenden Funktionen ausgeführt, die LifeTime um 1 verringert und gegebenenfalls das Element aus der Queue gelöscht. Mit der ID hatte man zusätzlich noch die Möglichkeit, ein Kommando das ewig läuft(LifeTime = 0) aus der Queue wieder zu entfernen. Das Problem ist nur, das jede Klasse, die etwas Zeichenen will, komplexe verwaltungsmechanismen anlegen muss, um die ID zu speichern und auszuwerten.

Eventhandler:
Ich habe in der OpenGL Klasse einen EventHandler angelegt, der bei jedem aufruf des Paint-Ereignisses des OpenGL-Fensters mit aufgerufen wurde. So mussten andere Klassen nur noch einen Handler dafür anlegen und hinzufügen.
Problem ist nur, das man wieder viel Aufwand benötigt, um in diesem Ereigniss zu wissen was zu rendern ist.

Hat jemand von euch eine andere Lösung oder verbesserungen der bisherigen.
Welche würdet ihr bevorzugen?
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Verwaltungsystem für Render-Aufgaben

Beitrag von Xin » So Nov 15, 2009 7:36 pm

cloidnerux hat geschrieben:Kommandoqueue:
Ich lege eine Queue an, in dem ich eine Klasse ablege, die einen Funktionspointer, LifeTime und id enthält.
Bei dem Paint Ereignis des OpenGL Fensters wird diese Queue durchgelesen und die betreffenden Funktionen ausgeführt, die LifeTime um 1 verringert und gegebenenfalls das Element aus der Queue gelöscht. Mit der ID hatte man zusätzlich noch die Möglichkeit, ein Kommando das ewig läuft(LifeTime = 0) aus der Queue wieder zu entfernen. Das Problem ist nur, das jede Klasse, die etwas Zeichenen will, komplexe verwaltungsmechanismen anlegen muss, um die ID zu speichern und auszuwerten.
Du kannst die Queue weiterhin kürzen, in dem Du schaust, ob das Objekt überhaupt im Bereich liegt, der gezeichnet werden muss.

Ansonsten würde ich ein Interface anlegen, dass alle zeichenbaren Klassen implementieren müssen und gut.
cloidnerux hat geschrieben:Eventhandler:
Ich habe in der OpenGL Klasse einen EventHandler angelegt, der bei jedem aufruf des Paint-Ereignisses des OpenGL-Fensters mit aufgerufen wurde. So mussten andere Klassen nur noch einen Handler dafür anlegen und hinzufügen.
Problem ist nur, das man wieder viel Aufwand benötigt, um in diesem Ereigniss zu wissen was zu rendern ist.
Das ist die gleiche Lösung, wie die Queue, die Du vorher genannt hast. Nur, dass in dem Fall C# die Liste organisiert.
cloidnerux hat geschrieben:Hat jemand von euch eine andere Lösung oder verbesserungen der bisherigen.
Welche würdet ihr bevorzugen?
Der Eventhandler ist saubere OOP-Programmierung. Mach 50000 Objekte und Du wirst anfangen, Dir schmutzige Tricks auszudenken ;-)
Also versuch lieber einen schmutzigen Ansatz und implementiere den sauber.

Ansonsten.... versuche Deine Queue möglichst klein zu halten. Damit fallen die Events wieder raus, weil da grundsätzlich alle Objekte drin sind.

Musst Du alle Daten wieder in die Grafikkarte laden oder kannst Du Sachen in der Grafikkarte speichern?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Verwaltungsystem für Render-Aufgaben

Beitrag von cloidnerux » So Nov 15, 2009 7:59 pm

Musst Du alle Daten wieder in die Grafikkarte laden oder kannst Du Sachen in der Grafikkarte speichern?
C# und Tao, also alles was das Framework hergibt.
Grundsätzlich nur OpenGl 2.4 über die "Direkte" Variante, also mit glBegin und glEnd.
Display List sind glaube ich auch noch drinn, wie OpenGL das jezt genau regelt weiß ich nicht.
Der Eventhandler ist saubere OOP-Programmierung. Mach 50000 Objekte und Du wirst anfangen, Dir schmutzige Tricks auszudenken ;-)
Also versuch lieber einen schmutzigen Ansatz und implementiere den sauber.
Noch mehr schmutz und ich muss den Hochdruckreiniger herausholen ;-)
Du kannst die Queue weiterhin kürzen, in dem Du schaust, ob das Objekt überhaupt im Bereich liegt, der gezeichnet werden muss.
Jezt fragt man sich, ob es mehr aufwand ist, den Sichtbaren bereich zu berechnen oder die paar Linien zeichnen lässt.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Verwaltungsystem für Render-Aufgaben

Beitrag von Xin » So Nov 15, 2009 8:16 pm

cloidnerux hat geschrieben:Display List sind glaube ich auch noch drinn, wie OpenGL das jezt genau regelt weiß ich nicht.
Okay, in dem Fall hast Du den Kram ja schon mehr oder minder abgegeben.

Aber offenbar musst Du ja wissen, was grade gezeichnet wird, bzw. dafür sorgen, dass nicht gezeichnete Objekte nicht informiert werden, dass sie jetzt nicht gezeichnet werden.
cloidnerux hat geschrieben:
Der Eventhandler ist saubere OOP-Programmierung. Mach 50000 Objekte und Du wirst anfangen, Dir schmutzige Tricks auszudenken ;-)
Also versuch lieber einen schmutzigen Ansatz und implementiere den sauber.
Noch mehr schmutz und ich muss den Hochdruckreiniger herausholen ;-)
*lach*
cloidnerux hat geschrieben:
Du kannst die Queue weiterhin kürzen, in dem Du schaust, ob das Objekt überhaupt im Bereich liegt, der gezeichnet werden muss.
Jezt fragt man sich, ob es mehr aufwand ist, den Sichtbaren bereich zu berechnen oder die paar Linien zeichnen lässt.
Es ist einfach die Frage, wieviele Linien es sind... ^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Verwaltungsystem für Render-Aufgaben

Beitrag von cloidnerux » So Nov 15, 2009 9:04 pm

Aber offenbar musst Du ja wissen, was grade gezeichnet wird, bzw. dafür sorgen, dass nicht gezeichnete Objekte nicht informiert werden, dass sie jetzt nicht gezeichnet werden.
3 Fache Verneinung :?:
Naja, bei einem CAD-Programm, kommt es ja vor, das Linien eins Objektes außerhalb des Bildschirmbereichs liegen, wobei es in diesem fall am Renderer liegt, diese nicht zu Zeichnen.
Zudem müsste ich ja wieder über die Queue oder was auch immer wieder auf die Klasse zugreifen, Prüfen ob irgendein Teil im Bildschrimbereich liegt und diesen dann Zeichen oder nicht.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Verwaltungsystem für Render-Aufgaben

Beitrag von Xin » So Nov 15, 2009 9:13 pm

cloidnerux hat geschrieben:
Aber offenbar musst Du ja wissen, was grade gezeichnet wird, bzw. dafür sorgen, dass nicht gezeichnete Objekte nicht informiert werden, dass sie jetzt nicht gezeichnet werden.
3 Fache Verneinung :?:
Du musst verhindern, dass Objekte, die nicht gezeichnet werden, ein Event erhalten.
cloidnerux hat geschrieben:Naja, bei einem CAD-Programm, kommt es ja vor, das Linien eins Objektes außerhalb des Bildschirmbereichs liegen, wobei es in diesem fall am Renderer liegt, diese nicht zu Zeichnen.
Das kann man so sehen. Wenn OpenGL Dein Renderer ist, dann wird Dein Renderer dankbar sein, wenn Du die Informationen eher klein hältst.
cloidnerux hat geschrieben:Zudem müsste ich ja wieder über die Queue oder was auch immer wieder auf die Klasse zugreifen, Prüfen ob irgendein Teil im Bildschrimbereich liegt und diesen dann Zeichen oder nicht.
Es gilt zu testen, was länger dauert. Linien sind ja noch sehr einfache Objekte. Das gilt zum Testen genauso, wie zum Zeichnen. Die Frage ist halt, ob das Kopieren der Daten mit den Funktionsaufrufen (glBegin().... glEnd()) und das anschließende Rendern nicht länger braucht, als das setzen eines (Nicht-)Rendern-Bits.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten