Wiederverwendung von World möglich?

Started by Lobby, January 09, 2014, 10:10:55 PM

Previous topic - Next topic

Lobby

Hallöchen,

ich spiele jetzt schon ein bisschen länger mit jpct-ae herum und stelle mir nun die Frage, ob es wirklich wie in den Samples gezeigt, nötig ist immer eine neue Welt zu erstellen wenn das Programm zwischenzeitlich pausiert oder Ähnliches wurde. Globale statische Instanzen bleiben dabei offensichtlich (siehe z.B. TextureManager) ja auch erhalten, aber wenn ich auf gleiche Art und Weise versuche meine World-Instanz wiederzuverwenden ist von den erstellten Objekten in der 3D-Welt nichts mehr zu sehen. Den Framebuffer erstelle ich jedes Mal neu, und wenn ich immer ein neues World-Objekt erstelle klappt das auch wunderbar - nur entspricht das nicht ganz dem "nur einmal Laden und Vorbereiten" Prinzip das ich von Computerprogrammen kenne und recht bequem ist wenn man nicht den Weltzustand jedes Mal speichern und wieder neu aufbauen möchte.

EgonOlsen

Nein, musst du nicht. Die Beispiele machen das vielleicht, um die Sache einfach zu halten. World hat keinerlei Bindung an den OpenGL-Kontext und von daher muss sie auch nicht neu erstellt werden. Wieso du nach einer Pause sonst nichts mehr siehst, ist mir nicht klar. Machst du vielleicht irgendwo in onPause() oder onStop() oder so irgendwas mit der World?

Lobby

Gut, dann liegt es wohl an mir. Um dem Problem näher zu kommen habe ich versucht ein minimal kleines Programm zu schreiben, das mir zeigen sollte ob ich einen grundsätzlichen Denkfehler habe - und Tatsache, das Testprogramm läuft so wie gewünscht. Nun muss ich nur noch herausfinden, was ich in meinem Projekt anders gemacht habe... :-\

Falls noch jemand über so ein Problem stolpern sollte, hier mein Testprogramm in dem World erfolgreich wiederverwendet wird. Dass es funktioniert zeigt sich daran, dass die App auch nach einer Änderung der Ausrichtung noch funktioniert.

Lobby

#3
Ich habe nichts weiter mit dem Welt-Objekt gemacht und langes Herumprobieren hat mich nun schließlich zum Ergebnis gebracht, dass ich den Renderer (wie in meinem ReuseWorld Projekt) wiederverwenden muss, denn ansonsten kommt es eben zu oben beschriebenen Verhalten. Da ich den Renderer von der Spielelogik entkoppelt habe sollte es eigentlich unabhängig vom Renderer funktionieren, das finde ich jetzt doch sehr verwirrdend ???

So sieht der Renderer aus, wie man sieht ist er komplett vom Rest entkoppelt (hält selbst keine Objekte) und sollte somit eigentlich austauschbar sein:
private class Renderer implements GLSurfaceView.Renderer {
@Override
public void onDrawFrame(GL10 arg0) {
game.onUpdate();
game.onRender();
}

@Override
public void onSurfaceChanged(GL10 arg0, int width, int height) {
if (buffer != null) {
buffer.dispose();
}
buffer = new FrameBuffer(width, height);
}

@Override
public void onSurfaceCreated(GL10 arg0, EGLConfig arg1) {
}
}


Ich würde mal vermuten dass die Ursache irgendwelche Arbeiten im Hintergrund sind.

EgonOlsen

#4
Quote from: Lobby on January 09, 2014, 11:40:20 PM
Ich würde mal vermuten dass die Ursache irgendwelche Arbeiten im Hintergrund sind.
Nö, jedenfalls nicht an dieser Stelle und nicht mit World. jPCT-AE interessiert sich an keiner Stelle für irgendwelche Renderer. Die sind ihm völlig unbekannt und egal. Es gibt einen Bindung an den OpenGL-Kontext, aber die ist nicht in World. Sie ist allerdings indirekt in Object3D, weil diese Daten ja zur GPU geschaufelt werden. jPCT-AE kann aber erkennen, ob der Kontext sich geändert hat und agiert dann entsprechend. Das kann es aber nicht am Kontext selber erkennen, sondern es nutzt dafür die Instanz von FrameBuffer.
D.h. wenn sich der OpenGL-Kontext ändert (was bei Pause passieren kann, aber nicht muss), dann muss auch ein neuer FrameBuffer erzeugt werden. World, Object3D, Texture usw...müssen nicht neu erzeugt werden. Solange der verwendete FrameBuffer zum aktuellen Kontext passt, funktioniert das. Kann es sein, dass du zwar neue Renderer erzeugst, aber keinen neuen FrameBuffer?