OpenGLContext, Create Rendering Context [ gelöst ]

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

OpenGLContext, Create Rendering Context [ gelöst ]

Beitrag von corpsman »

Guten Morgen allerseits,

Ich bin erst seit kurzem bei Lazarus und doch shcon total begeistert.

Jedooch habe ich so meine Probleme mit der Komponente OpenGLContext.

Diese erzeugt bei jedem "Paint" event des Parents einen neuen Renderingcontext. Dies hat zur folge das man sämtliche Graphiken neu laden mus.

Bei größeren Spielen wie z.b. Balanced welches ich gerade nach Linux übersetzte, erzeugt dies einen nicht unbedingt vertretbaren overhead an ladeoperationen ( vor allem , da das Laden der Texturen in diesem Spiel aufgrund der Masse schon mal 1-2 secs. dauert ).

Der witz ist das eine Neuerstellung des Renderingcontextes eigentlich nicht notwendig ist. Denn z.b. eine SDL Anwendung macht dies nicht. Die Frage ist daher, kenne ich den notwendigen "Switch" nicht , um das OpenGLControl richtig zu parametrisieren, oder mus ich auf SDL wechseln ?
Zuletzt geändert von corpsman am Sa 22. Aug 2009, 22:43, insgesamt 1-mal geändert.
--
Just try it

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: OpenGLContext, Create Rendering Context

Beitrag von pluto »

Such mal hier im Forum nach OpenGL Render Context. Es gibt hier einige Beiträge drüber. Ich würde folgende drei Dinge Vorschlagen:
01) Schau dir Andorra an, eventuell läuft das bei dir und reicht für dich aus
02) unter http://www.delphigl.com" onclick="window.open(this.href);return false; gibt es ein prima OpenGL LIb(Meine ich) das auch unter FPC laufen sollte.
03) Es ohne Komponente versuche. Allerdings muss es doch einen Grund geben, wenn der Context ständig neu erstellt wird ? Mir fällt zwar keiner ein, aber es sollte einen geben oder ist das ein BUG ?
Ich frage mich auch, warum man dann alle Grafiken neu laden muss. Kannst du sie nicht unabhängig vom Context speichern \ laden ?
MFG
Michael Springwald

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: OpenGLContext, Create Rendering Context

Beitrag von corpsman »

Also,

Wenn ein Renderingcontext erstellt wird, werden alle Graphiken der Anwendung die vorher erstellt wurden automatisch ungültig, das ist irgend eine OpenGl spezifikation.

Ich nutze bereits "dglOpenGL.pas" die von delphigl.com diese Unit kann aber leider nur unter Windows den Renderingcontext erstellen, unter Linux geht das nicht.

Das Häufige Erzeugen des renderingcontextes, kommt, daher, das bei OpenGLControl.Paint, ein Invalidate aufgerufen wird. Dieses erzeugt den Renderingcontext neu.

Allerdings sieht der Header ja so :

Code: Alles auswählen

procedure Tform1.OpenGLControl1MakeCurrentEvent(Sender: TObject; var Allow: boolean);
aus. also dachte ich mir spiele ich mit dem "Allow" mal ein wenig rum.

und tatsächlich, man mus dieser Variable genau 2 mal auf True setzen, danach nicht mehr, warum genau 2 mal, keine Anung, aber die 2 mal kommen schon beim Create, des Formulares, da lade ich eh nur ein paar Widgetdaten, erst später beim Level laden kommen die eigentlichen Texturen in den Speicher.

Das coole ist sogar einen Resize überlebt der Context, somit ist auch dieses Problem aus der welt ;).
--
Just try it

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: OpenGLContext, Create Rendering Context [ gelöst ]

Beitrag von pluto »

Graphiken der Anwendung die vorher erstellt wurden automatisch ungültig, das ist irgend eine OpenGl spezifikation.
Wo ist hier der Sinn an der sache ? Ich würde das als Fehler ansehen. Was hat ein "Render Context" mit den Grafiken zu tun ? Ich nehme an mit Grafiken meinst du Texturen, die du um Objekte zeichnen möchtest.

Eventuell solltest du dieses Verhalten mal im Bugtracker Eintragen und es als "Seltsames Verhalten" Definieren.
MFG
Michael Springwald

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: OpenGLContext, Create Rendering Context [ gelöst ]

Beitrag von corpsman »

ok, ich glaube ich habe mich nicht deutlich genug ausgedrückt.

Stelle dir die Graphikkarte als Betriebsystem vor.

ein Renderingkontext stellt dann eine Anwendung dar.

Texturen ( die ich fälschlicherweise als graphiken betitelte ) sind Objecte der "Anwendung" welche Speicher von der Graphikkarte zugeteilt bekommen haben.
Wenn nun ein neuer Renderingcontext erzeugt wird, dann wird vorher der Alte gelöscht. Und genau wie bei einem Richtigen Betriebsystem wird der Geladene Speicher freigegeben = alle alten Texturen werden gelöscht.

Die Graphiken bleiben davon natürlich unberührt, da sie ja auf der Platte liegen und nur beim erzeugen der Textur benötigt wurden.

=> das "Löschen" der Alten Texturen ist somot wichtig, gut und Richtig.

Lediglich das ich 2 Renderingcontexte erzeugen mus, ist merkwürdig.
--
Just try it

Antworten