# JOGL GL Kontext Initialisierung



## xorm (16. Okt 2009)

Hallo Java Forum,

ich habe schon wieder eine Frage zu JOGL, genauer gesagt zu der init() Methode des GLEventlisteners. Ich habe ein Fenster (JFrame) indem sich neben einigen anderen Komponenten ein GLJPanel befindet. Sobald das Fenster sichtbar wird, wird init() aufgerufen, da wahrscheinlich in diesem Moment der entsprechende GL Kontext erstellt wird. 
Gibt es eine Möglichkeit diesen GL Kontext schon vorher manuell zu erstellen, sodass die Initialisierungen in init() vorgenommen werden, bevor das Fenster überhaupt sichtbar ist?

In der JOGL Dokumentation steht ja beschrieben das init() mehrmals aufgerufen wird (wenn z.B. das Fenster geöffnet und geschlossen wird). Kann ich umgekehrt davon ausgehen, dass init() nur einmal aufgerufen wird, wenn das Fenster während der gesamten Programmlaufzeit geöffnet bleibt und das GLJPanel nicht entfernt wird?


----------



## Marco13 (16. Okt 2009)

Ein früheres Initialisieren ...? Wüßte ich erstmal nicht, man braucht ja soweit ich weiß zuerst mal das GLAutoDrawable ... aber der Zweite Punkt:

GLJPanel (JOGL, NativeWindow and NEWT APIs) : _Note that because this component attempts to use pbuffers for rendering, and because pbuffers can not be resized, somewhat surprising behavior may occur during resize operations; the GLEventListener.init(javax.media.opengl.GLAutoDrawable) method may be called multiple times as the pbuffer is resized to be able to cover the size of the GLJPanel._


----------



## xorm (16. Okt 2009)

Danke für den Hinweis mit dem GLJPanel.


Mein Problem mit dem Initialisieren ist folgendes:

Ich habe mehrere Ansichten, die neben der 3D Ansicht, in einem Fenster angezeigt werden. Über diese Ansichten kann die Darstellung in der 3D Ansicht manipuliert werden. Für diesen Zweck kann jede Ansicht bestimmte Ressourcen besitzten, für deren Initialisierung ein GL ObjeKt benötigt wird (z.B. Texturen, VBOs, etc.)

Im Moment sieht meine Initialisierung wie folgt aus:
-Fenster und Ansichten erstellen
-Fenster sichtbar machen (erstellt GL Kontext)
-Innerhalb von init() für jede Ansicht die entsprechenden JOGL Ressourcen initialisieren (Texturen, VBOs, etc.)

Probleme:
1. Da das Laden der Texturen und das Erstellen der VBOs auch etwas Zeit braucht, ist die Anwendung in den ersten Sekunden nach Anzeigen des Fensters noch nicht wirklich benutzbar.
2. Ich brauche 2 getrennte Initialisierungsvorgänge für jede Ansicht da ich zuerst die Ansicht erstellen muss, die JOGL Ressourcen aber erst zu einem späteren Zeitpunkt laden kann.

Aus diesem Grund würde ich gerne alles erst initialisieren und anschließend erst das Fenster sichtbar machen.


----------



## Spacerat (17. Okt 2009)

So würde das meiner Ansicht nach keinen Sinn machen, solange der GLJPanel nicht "resized" wird. Vielmehr würde es Sinn machen, die Verschiedenen Ansichten zu Nummerieren und sich die Nummer der aktuellen Ansicht merken um in der "display()"-Methode auf Änderungen zu reagieren.
	
	
	
	





```
public void display(GLAutoDrawable d)
{
  if(ansicht_a != ansicht_b) {
    switch(ansicht_a) {
    case 1:
      // Ansicht 1 initialisieren
      break;
    case 2:
      // Ansicht 2 initialisieren
      break;
    // usw
    }
    ansicht_b = ansicht_a;
  }
  // und weiter gehts
}
```
Die Lösung ist im übrigen nicht besonders sauber, da die Listener-Methoden durchweg für grössere Ladevorgänge nicht sehr geeignet sind. Vllt. lässt sich das Laden und Umschalten ja noch in einem separaten Thread realisieren.


----------

