Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mo Jul 07, 2025 06:17

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Performancefrage
BeitragVerfasst: Sa Apr 14, 2007 10:58 
Offline
DGL Member

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:
  1. Spielfeld.DrawScene; //Beinhaltet das Spielfeld mit den Figuren, etc
  2. 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:
  1. if inGame then
  2.  Spielfeld.DrawScene
  3. else
  4. if inGUI then begin
  5.  RenderScreenshot;
  6.  GUI.Draw;
  7. 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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 14, 2007 11:57 
Offline
DGL Member

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.

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 14, 2007 12:16 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
Bei mir sind die beiden GUIs getrennt (GUI und HUD), von daher stellt das kein Problem dar.

Ok, danke, ich baus nachher ein, wollt nur mal kurz fragen obs sinnvoll ist. Anscheinend schon ;)

mfg
Carmageddon

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 15, 2007 17:34 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 16, 2007 18:00 
Offline
DGL Member

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 :P ), 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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 16, 2007 18:14 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Ja, es ist definitiv einfacher und schneller.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 16, 2007 20:26 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 05, 2007 19:54 
Offline
DGL Member

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)

Bild


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:
  1.     glBegin(GL_Quads);
  2.     //Vorderwand
  3.     glColor3f(1, 0, 1); glVertex3f(-1.5, -1.5, 1.5);
  4.     glColor3f(1, 0, 0); glVertex3f(1.5, -1.5, 1.5);
  5.     glColor3f(0, 1, 0); glVertex3f(1.5, 1.5, 1.5);
  6.     glColor3f(0, 0, 1); glVertex3f(-1.5, 1.5, 1.5);
  7.  
  8.     //Obere Seite
  9.     glColor3f(0, 0, 1); glVertex3f(-1.5, 1.5, 1.5);
  10.     glColor3f(0, 1, 0); glVertex3f(1.5, 1.5, 1.5);
  11.     glColor3f(1, 0, 1); glVertex3f(1.5, 1.5, -1.5);
  12.     glColor3f(1, 0, 0); glVertex3f(-1.5, 1.5, -1.5);
  13.  
  14.     //Linke Seite
  15.     glColor3f(0, 1, 0); glVertex3f(-1.5, -1.5, -1.5);
  16.     glColor3f(1, 0, 1); glVertex3f(-1.5, -1.5, 1.5);
  17.     glColor3f(0, 0, 1); glVertex3f(-1.5, 1.5, 1.5);
  18.     glColor3f(1, 0, 0); glVertex3f(-1.5, 1.5, -1.5);
  19.    
  20.   [...] //Und so weiter halt




Hier noch mein Code der die Scene auf die Textur rendert:
Code:
  1.   glClearColor(0.5,0.0,0.0,0);
  2.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  3.   glViewport(0, 0, 256, 256);
  4.   RenderObj; //Zeichnet die Figuren
  5.   glBindTexture(GL_TEXTURE_2D, Screen);
  6.   glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 256, 256, 0);
  7.   glClearColor(0.3, 0.4, 0.7, 0.0);
  8.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  9.   glViewport(0, 0, 800, 600);


Irgendwie komisch oder? Ich hab keine Ahnung woran das liegt, ihr?

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 09, 2007 16:38 
Offline
DGL Member

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.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]