Registriert: Mo Dez 26, 2005 22:27 Beiträge: 117
Programmiersprache: Pascal, C++
Ich weiß nicht ob das der richtige Bereich ist, denn ich möchte keinen Code und ich habe auch noch keinen Code, es geht mir nur darum, ob dass, was ich vorhabe sinnvoll ist oder nicht.
Es geht um folgendes:
Ich render meine Scene ungefähr so:
Code:
Spielfeld.DrawScene;//Beinhaltet das Spielfeld mit den Figuren, etc
GUI.Draw;//Wird bei nur bei Bedarf gezeichnet
Jetzt ist es natürlich relativ sinnlos, das Spielfeld zu zeichnen, während man sich in der GUI befindet (da sich ja daran sowieso nix ändert). Da man wenn man sich in der GUI befindet aber noch auf das Spielfeld blicken kann, und ich das auch beibehalten will, hab ich mir gedacht, machst du dir einfach einen Screenshot von der aktuellen Scene und zeichnet dann das, anstatt man wieder alles neu berechnet und zeichnet.
Wenn man dann wieder ins Spiel zurückkehrt, gebe ich den Screen frei und rendere normal weiter.
Also ungefär so: (Pseudocode)
Code:
if inGame then
Spielfeld.DrawScene
else
if inGUI thenbegin
RenderScreenshot;
GUI.Draw;
end;
Ich habe einen relativ "leistungsschwachen" PC und wenn ich mich in der GUI befinde, merk ich doch, dass er länger braucht um zu reagieren. Auf neueren PC merkt man nichts (getestet).
Jetzt meine Frage: Lohnt es sich so etwas einzubauen, bzw: Bringt das eine verbesserte Performance?
Oder sollte ich ehr meinen RenderCode von der GUI und vom Spielfeld verbessern (oder beides )
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Registriert: Sa Okt 22, 2005 20:24 Beiträge: 291 Wohnort: Frauenfeld/CH
ja sowas hab ich auch gemacht, allerdings wird bei mir die GUI auch beim spielen selbst gerendert, da man ja gewisse Informationen braucht im Spiel. (z.B. Geld usw)
Eine boolean abfrage ist ja sowieso so gut wie nichts, da lohnt sich das ganze schon.
In Prozeduren auslagern sollte man sowieso, dann ist es ja auch nicht mehr schwer diese Abfrage einzubauen.
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Hier vielleicht eine kleine Entscheidungshilfe:
Ich erstelle derzeit eine GUI mit Pascal und OpenGL:
Mein Test-Computer ist ein Toshiba Laptop mit 2.4GHz, die Grafikkarte ist von Intel (nicht wirklich das Gelbe vom Ei für Spiele) und stellt OpenGL 1.3 zur Verfügung.
Die Widgetformen sind in Displaylisten verpackt und laufen in einer Sandbox (soll heißen: Orthomodus mit PushMatrix/PopMatrix) und können daher über die 3D-Szene drübergelegt werden.
Ich lasse zwei Fenster gleichzeitig laufen, wobei jedes Fenster einen eigenen Rendering Context hat, eines "OnPaint", das andere "OnIdle" (so wie in der VCL).
Im Hintergrund des OnIdle-Fensters rotiert ein einfaches texturiertes Quad, um ein 3D-Rendering zu simulieren.
Performance des OnIdle-Fensters:
Ohne GUI rund 360 FPS
Mit GUI (bestehend nur aus einem Panel und einer ScrollBox, also zwei Widgets) rund 235 FPS, ein zusätzliches Widget senkt die Performance des Fensters um rund 5FPS.
Wenn also gleichzeitig eine komplexe 3D-Szene im Hintergrund läuft, geht bei einer GUI mit vielen Widgets mein einfaches Laptop vielleicht in die Knie. Das Rendern in eine Textur könnte Abhilfe schaffen. Das Trennen von HUD und "richtiger" GUI ist sicher eine gute Idee.
Registriert: Mo Dez 26, 2005 22:27 Beiträge: 117
Programmiersprache: Pascal, C++
Okay, danke erstmal soweit.
Jetzt hab ich doch glatt eine weitere Frage: Im Moment löse ich das mit dem Hintergrundbild, indem ich einen Screenshot erstelle mit dem Code hier (Wiki - Screenshot).
Den Code hab ich mir so umgeschrieben, dass er das ganze direkt in Streams speichert, dann hole ich mir per TBitmap.LoadFromStream das Bild in ein TBitmap, welches ich dann zu einer gluInt umforme und dass ganze dann ganz normal per Texture ausgebe.
Klinkt umständlich, ist es auch (und so richtig klappen tut es auch net ), und da ich jetzt grad was von RenderToTexture les: Wär des einfacher als das was ich gerade mach?
Ich mach mich jetzt erstma schlau darüber
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Das einfachste ist den Inhalt mit glCopyTexImage2D in eine Texture zu kopieren. Diese Texture kann man dann auch beim Rendern der GUI nutzen, z.B. um einen Glass-Effekt wie bei Vista oder ähnliches darzustellen.
Registriert: Mo Dez 26, 2005 22:27 Beiträge: 117
Programmiersprache: Pascal, C++
Ok, ich hab mich jetzt mal an RenderToTexture rangewagt, hat auch ganz gut geklappt (natürlich nur dank dem super tut hier ) aber ich habe einen mir komplett unverständlichen Fehler gefunden.
Ich habe zwecks Übung ein kleines Programm geschrieben, dass dem im Tutorial recht ähnlich ist (drei Bildschirme, mit Figur vorne dran). Nur....:
In meinen Bildschirmen wird die Farbe blau in schwarz umgewandelt. Ich weiß nicht woran das liegen könnte.
Schaut so aus (die Bildschirmhintergrundfarbe ist zum besseren erkennen dunkelrot)
Im Programm ist natürlich nicht alles so verschwommen. Liegt am schlechten Bild.. sry
aber was man sieht ist, das die blaue Fläche im Bildschirm schwarz ist..
Mein Code zum zeichen der Figuren (gekürzt)
Code:
glBegin(GL_Quads);
//Vorderwand
glColor3f(1,0,1); glVertex3f(-1.5,-1.5,1.5);
glColor3f(1,0,0); glVertex3f(1.5,-1.5,1.5);
glColor3f(0,1,0); glVertex3f(1.5,1.5,1.5);
glColor3f(0,0,1); glVertex3f(-1.5,1.5,1.5);
//Obere Seite
glColor3f(0,0,1); glVertex3f(-1.5,1.5,1.5);
glColor3f(0,1,0); glVertex3f(1.5,1.5,1.5);
glColor3f(1,0,1); glVertex3f(1.5,1.5,-1.5);
glColor3f(1,0,0); glVertex3f(-1.5,1.5,-1.5);
//Linke Seite
glColor3f(0,1,0); glVertex3f(-1.5,-1.5,-1.5);
glColor3f(1,0,1); glVertex3f(-1.5,-1.5,1.5);
glColor3f(0,0,1); glVertex3f(-1.5,1.5,1.5);
glColor3f(1,0,0); glVertex3f(-1.5,1.5,-1.5);
[...]//Und so weiter halt
Hier noch mein Code der die Scene auf die Textur rendert:
Code:
glClearColor(0.5,0.0,0.0,0);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
Registriert: Mo Dez 26, 2005 22:27 Beiträge: 117
Programmiersprache: Pascal, C++
Okay, im Testprogramm klappt es zwar nicht so wie es eigentlich sein sollte, aber nachdem ich dass ganze jetzt im Orginal-Spiel integriert habe, läuft es dort einwandfrei.
Thema kann als abgeschloßen betrachtet werden
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.