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?
Verwaltungsystem für Render-Aufgaben
- cloidnerux
- Moderator
- Beiträge: 3123
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Verwaltungsystem für Render-Aufgaben
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
- 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
Du kannst die Queue weiterhin kürzen, in dem Du schaust, ob das Objekt überhaupt im Bereich liegt, der gezeichnet werden muss.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.
Ansonsten würde ich ein Interface anlegen, dass alle zeichenbaren Klassen implementieren müssen und gut.
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: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.
Der Eventhandler ist saubere OOP-Programmierung. Mach 50000 Objekte und Du wirst anfangen, Dir schmutzige Tricks auszudenkencloidnerux hat geschrieben:Hat jemand von euch eine andere Lösung oder verbesserungen der bisherigen.
Welche würdet ihr bevorzugen?
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
- cloidnerux
- Moderator
- Beiträge: 3123
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Verwaltungsystem für Render-Aufgaben
C# und Tao, also alles was das Framework hergibt.Musst Du alle Daten wieder in die Grafikkarte laden oder kannst Du Sachen in der Grafikkarte speichern?
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.
Noch mehr schmutz und ich muss den Hochdruckreiniger herausholenDer 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.
Jezt fragt man sich, ob es mehr aufwand ist, den Sichtbaren bereich zu berechnen oder die paar Linien zeichnen lässt.Du kannst die Queue weiterhin kürzen, in dem Du schaust, ob das Objekt überhaupt im Bereich liegt, der gezeichnet werden muss.
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
- 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
Okay, in dem Fall hast Du den Kram ja schon mehr oder minder abgegeben.cloidnerux hat geschrieben:Display List sind glaube ich auch noch drinn, wie OpenGL das jezt genau regelt weiß ich nicht.
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.
*lach*cloidnerux hat geschrieben:Noch mehr schmutz und ich muss den Hochdruckreiniger herausholenDer 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.
Es ist einfach die Frage, wieviele Linien es sind... ^cloidnerux hat geschrieben:Jezt fragt man sich, ob es mehr aufwand ist, den Sichtbaren bereich zu berechnen oder die paar Linien zeichnen lässt.Du kannst die Queue weiterhin kürzen, in dem Du schaust, ob das Objekt überhaupt im Bereich liegt, der gezeichnet werden muss.
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
- cloidnerux
- Moderator
- Beiträge: 3123
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Verwaltungsystem für Render-Aufgaben
3 Fache VerneinungAber 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.
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
quod erat expectandum
- 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
Du musst verhindern, dass Objekte, die nicht gezeichnet werden, ein Event erhalten.cloidnerux hat geschrieben:3 Fache VerneinungAber 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.
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: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.
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.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.
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.