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

Aktuelle Zeit: Sa Jul 19, 2025 23:46

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



Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: niedrige fps auch bei kleinen szenen
BeitragVerfasst: Mi Feb 03, 2010 17:43 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
Hallo,

ich hab mal wieder ein Problem, unzwar habe ich selbst bei meiner kleinen unspektakulären Szene nur 20-25 fps,

das kann ja aber eigentlich nicht sein da meine Szene sehr klein ist.

Ich habe auch bisschen probiert und festgestelt das wenn ich nur den Text mit hilfe von Textsuite rendere ich bei 30fps lande,

Demoprogramme laufen allerdings meist mit 300-700fps, diese Framzahlen hab ich mit eigenen Programmen noch nie erreicht.

Meine Frage lautet nun wie kann ich erreichen das ich mehr fps bekomme bzw den Rechner nicht schon mit kleineren sachen komplett auslaste.

Da ihr ja so gerne code lest um euch was vorstellen zu können hier mal meine renderprozedure

Code:
  1. procedure Tform1.Render;
  2. begin
  3.   CheckForGameErrors;
  4.   steps := steps + 1;
  5.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  6.  
  7.   //Bewegung der Maus Feststellen wenn Steuerung mit der Maus aktiviert wurde
  8.   if ViewByMouse = true then
  9.   ViewByMousep;
  10.  
  11.   glMatrixMode(GL_PROJECTION);
  12.   glLoadIdentity;
  13.   glOrtho(0, Optionen.Aufloesung[1], Optionen.Aufloesung[2], 0, 5, 20);
  14.   glMatrixMode(GL_MODELVIEW);
  15.   glLoadIdentity;
  16.  
  17.   //Draw 2D HUD
  18.   GameHUDText;
  19.  
  20.   glMatrixMode(GL_PROJECTION);
  21.   glLoadIdentity;
  22.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  23.   glMatrixMode(GL_MODELVIEW);
  24.   glLoadIdentity;
  25.  
  26.   glrotatef(PlayerPos.Rot,0,1,0);
  27.   gltranslatef(PlayerPos.X,Playerpos.Y,Playerpos.Z);
  28.  
  29.   //Draw 3D Szene
  30.   GameSzene3D;
  31.  
  32.   SwapBuffers(DC);
  33. end;


Zuerst das HUD also der ganze text

Code:
  1. procedure GameHUDText;
  2. begin
  3.   case GAME_CURRENT_HUD of
  4.     40001 : begin
  5.               DrawGameMainMenueHUD;
  6.             end;
  7.     40002 : DrawGameStationMenueHUD;
  8.   end;
  9. end;


Code:
  1. procedure DrawGameMainMenueHUD;
  2. begin
  3.   glDisable(GL_LIGHTING);
  4.   glDisable(GL_LIGHT0);
  5.   tsTextColor3f(1, 0, 0);
  6.  
  7.   tsFontBind(fMainFontID);
  8.  
  9.   tsSetParameteri(TS_ALIGN, TS_ALIGN_LEFT);
  10.     gltranslatef(0,0,-5);
  11.  
  12.     glPushMatrix;
  13.       glTranslatef(Optionen.Aufloesung[1]/7, Optionen.Aufloesung[2]/4, 0);
  14.       tsTextOutA('NEW GAME');
  15.       glTranslatef(0, Optionen.Aufloesung[2]/6, 0);
  16.       tsTextOutA('LOAD GAME');
  17.       glTranslatef(0, Optionen.Aufloesung[2]/6, 0);
  18.       tsTextOutA('OPTIONS');
  19.       glTranslatef(0, Optionen.Aufloesung[2]/6, 0);
  20.       tsTextOutA('QUIT');
  21.   glpopmatrix;
  22.  
  23.   tsFontBind(ftextFontID);
  24.  
  25.     glPushMatrix;
  26.       glTranslatef(Optionen.Aufloesung[1]/1.1, Optionen.Aufloesung[2]/1.05, 0);
  27.       tsTextOutA(PChar(Optionen.GameVersion));
  28.     glPopMatrix;
  29.        
  30.  
  31.     if Optionen.DrawFPS = 1 then begin
  32.       glPushMatrix;
  33.         glTranslatef(Optionen.Aufloesung[1]/100, Optionen.Aufloesung[2]/60, 0);
  34.         tsTextOutA(PChar('FPS: ' + inttostr(FPS)));
  35.       glPopMatrix;
  36.     end;
  37. end;


und dann noch die Szene im hintergrund

Code:
  1. procedure GameSzene3D;
  2. begin
  3.   case GAME_CURRENT_SZENE of
  4.     10001 : begin
  5.             if SzeneOneInit = false then
  6.               InitGameMenueSzeneOne
  7.             else
  8.               DrawGameMenueSzeneOne;
  9.             end;
  10.  
  11.     20001 : begin
  12.               if Station_Deck_init = false then
  13.                 Init_Station_Deck
  14.               else
  15.                 DrawGameIngameStationDeck;
  16.             end;
  17.     {20002 : DrawGameIngameStationBar;
  18.     20003 : DrawGameIngameStationTrader;}
  19.   end;
  20. end;


Code:
  1. procedure DrawGameMenueSzeneOne;
  2. var x : Integer;
  3. begin
  4.   glEnable(GL_LIGHTING);
  5.   glEnable(GL_LIGHT0);
  6.  
  7.   CalcNewPositions();
  8.  
  9.   for x := 1 to AnzahlObjecte do begin
  10.     gltranslatef(Startszene.posX[x],Startszene.posY[x],Startszene.posZ[x]);
  11.     glrotatef(StartSzene.Rot[x],0,1,0);
  12.       Startszene.Objecte[x].Render();
  13.     glrotatef((360 - StartSzene.Rot[x]),0,1,0);
  14.     gltranslatef(Startszene.posX[x] * -1,Startszene.posY[x] * -1,Startszene.posZ[x] * -1);
  15.   end;
  16.  
  17. end;
  18.  
  19. procedure CalcNewPositions();
  20. var x : Integer;
  21. begin
  22.   for x := 1 to AnzahlObjecte do begin
  23.     StartSzene.posX[x] := (StartSzene.posX[x] - ((sin(degtorad(Startszene.Rot[x]))* StartSzene.Geschw[x]) * timefactor));
  24.     StartSzene.posZ[x] := (StartSzene.posZ[x] - ((cos(degtorad(Startszene.Rot[x]))* StartSzene.Geschw[x]) * timefactor));
  25.   end;
  26. end;


ich hoffe ich hab diesmal gleich alles beachtet und ihr könnt mir wieder so gut helfen :)

lg


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 03, 2010 18:22 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
1. Wieviele Objekte kommen in der Szene vor
2. Wie werden diese gezeichnet (was macht Object[x].Render; ?)

Es kann sein, dass durch die Schleife eine imense Anzahl von Matrixmultiplikationen ausgelöst wird, was die niedriegen Frames begründen könnte. Kommen dann noch Push und Pop Befehle dazu kann das ebenfalls sehr negativ ausfallen.

Edit: ebenfalls kann deine Prozedur, die die neue Position berechnet eine totale Bremse sein. Für die Objekte lohnt es sich evtl. einen Matrixstack zu schaffen, so dass jedes Objekt eine Orientierungsmatrix hat, die aus Rotation und Transformation besteht. Dann musst du nicht 4 multiplikationen ausführen (gltranslatef & glscalef), sondern übergibst lediglich für jedes Objekt die Matrix als ModelViewMatrix.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 03, 2010 18:28 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

wenn du nur n Text mit der TextSuite ausgibst, und sonst nix, dann benutz die TZextSuite vlt irgendwas, was deine Graka nich unterstützt un dann schaltet sie in den Softwaremodus?!

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 03, 2010 18:36 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
Zitat:
1. Wieviele Objekte kommen in der Szene vor


es sind genau 8
- 6 kleine bewegte
- 1 großes bewegtes
- 1 großes unbewegtes

die objecte bewegen sich mit vorher festgelegten geschwindigkeiten die frei variabel aus einer datei gelesen werden

Zitat:
2. Wie werden diese gezeichnet (was macht Object[x].Render; ?)


StartSzene ist ein record welches wiefolgt aussieht

Code:
  1.   TStartSzene = record
  2.     Objecte   : array[0..10] of TWFObject;
  3.     posX : array[0..10] of double;
  4.     posY : array[0..10] of double;
  5.     posZ : array[0..10] of double;
  6.     Geschw : array[0..10] of real;
  7.     Rot : array[0..10] of double;
  8.   end;


StartSzene.Object[x] ist also ein TWFObject welches erstellt und geladen wurde

StartSzene.Object[x].Render() ist nun der aufruf für den WFObject-Loader das object an die gewünschte stelle zu zeichnen



das mit der matrixmultiplikation hab ich überhaupt nicht verstanden^^ kannst du mir das nochmal erklären bzw gibts da was feines zum anguggen?

aber an meiner kleinen procedure die die positionen berechnet liegt es nicht, unterbinde ich die positionsberechnung dann hab ich gerade mal 1 fps mehr

Zitat:
wenn du nur n Text mit der TextSuite ausgibst, und sonst nix, dann benutz die TZextSuite vlt irgendwas, was deine Graka nich unterstützt un dann schaltet sie in den Softwaremodus?!


wie kann ich das sehen oder testen?
E:\ Ich hab eine NVidia GTX260

lg


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 03, 2010 19:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Lese dir mal den Performance-Artikel im Wiki durch, vielleicht findest du so ja was.

Wie wird render den eigentlich aufgerufen? Verwendest du einen Timer, onIdle, oder so? Ich bin kein Delphi/Windows-User und weiß daher nicht was da nochmal genau das richtige war, jedenfalls kann man da wohl einiges falsch machen ;)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 03, 2010 19:33 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
gerendert wird im OnIdle;

Code:
  1. procedure Tform1.IdleHandler(Sender: TObject; var Done: Boolean);
  2. begin
  3.   StartTime:= GetTickCount;
  4.   Render;
  5.   DrawTime:= GetTickCount - StartTime;
  6.   Inc(TimeCount, DrawTime);
  7.   Inc(FrameCount);
  8.  
  9.   if TimeCount >= 1000 then
  10.   begin
  11.     Frames:= FrameCount;
  12.     TimeCount:= TimeCount -1000;
  13.     FRameCount:=0;
  14.     ErrorHandler;
  15.   end;
  16.   sleep(5);
  17.   Done:=False;
  18. end;


hab den sleep am ende mal rausgenommen nu sind wir schon bei 30fps^^

ich gugg mir den artikel mal an danke für den tipp


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 03, 2010 20:20 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das Push und Popmatrix könnte etwas dauern. Um das rauszufinden, müsste man aber mal den DGLBenchmark zum laufen bekommen... hab dazu gerade keine Zeit. Vielleicht nach dem Vortrag....

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 03, 2010 21:04 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
im Performance thread hab ich mir mal das tool von nvidia gezogen das da anzeigen soll wann wo meine programme wieviel zeit brauchen oder so XD ich guggs mir mal an vieleicht bringts ja paar nützliche daten

€ aha... die 64bit version sagt sie kann mein programm nicht ausführen da es 32bit ist, die 32bit version sagt das ich sie nicht installieren kann da sie kein 64bit OS unterstützt und die andere version die es da noch gibt geht zwar zu installieren aber die macht nix^^ da hab ich am ende kein programm drauf und nix


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Feb 04, 2010 08:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Bergmann89 hat geschrieben:
dann benutz die TZextSuite vlt irgendwas, was deine Graka nich unterstützt un dann schaltet sie in den Softwaremodus?!

Das kann ich ausschließen. Ich benutze nur RGBA POT Texturen und Quads. Wenn die Grafikkarte das nicht kann, dann würde ich mich fragen ob man mir nicht vielleicht eine Steintafel angedreht hat.

Dropye: Wie schaut es mit Fehlerprüfung von OpenGL aus? Wenn du irgendwo Fehler in deinem OpenGL Code hast, dann können sich Fehler mitunter stark auf die Performance auswirken. glGetError und gluGetString

Benutzt du Texturen deren Größe kein Vielfaches von 2 ist? Ist deine FPS Berechnung richtig?

Ansonsten kommentiere doch einfach immer mal Stück für Stück deines Zeichencodes aus (nachdem du auf Fehler geprüft hast). Wenn es irgendwo einen satten schub gibt, dann kannst du zu mindest die Stelle etwas eingrenzen. Das Wichtigste ist wohl erst mal rauszufinden woran es hackt. Dann kann man sich immer noch überlegen was man dagegen tun kann.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Feb 04, 2010 10:25 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Code:
  1. #
  2.   glMatrixMode(GL_PROJECTION);
  3. #
  4.   glLoadIdentity;
  5. #
  6.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  7. #
  8.   glMatrixMode(GL_MODELVIEW);
  9. #
  10.   glLoadIdentity;

Das würde ich definitiv mal auslager, unzwar in resize und die konstruierte DefaultProjectionmatrix würde ich auch weg speichern.
gluPersepective ist eine ziemlich teuere Operation, die auf der CPU durch läuft und dann hast du noch die Modeswitches und push pops sowie ständigen Transformationen.
Speicher dir die fertigen Matrizen für deine GUI elemente oder setzt die koordinaten direkt auf die vertice um, dann sparst du ne menge cpu-gpu sync.
Deine Graka ist ne Bestie, was hast du für ne CPU und bist du sicher, dass du aktuelle Treiber hast?

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Feb 04, 2010 11:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
TAK2004 hat geschrieben:
gluPersepective ist eine ziemlich teuere Operation, die auf der CPU durch läuft und dann hast du noch die Modeswitches und push pops sowie ständigen Transformationen.

Generell hast du damit vollkommen recht. gluPersepective und all die Matrixoperationen sind teuer. Allerdings fällt mir die Vorstellung sehr schwer, dass das Umschalten so dermaßen auf die Performance drückt, dass die Geschwindigkeit auf 30fps sinkt. In Tests die ich früher mal gemacht hatte hat das umschalten in 2D und wieder zurück ca 10% Geschwindigkeit ausgemacht. Das ist sehr viel aber selbst 40fps wären für das System wohl deutlich zu wenig.

Wie ich oben schon mal geschrieben habe sind alle Verbesserungsvorschläge wohl eher fragwürdig so lange man nicht genau weiß was für diesen drastischen Einbruch verantwortlich ist.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Feb 04, 2010 11:16 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich hoffe aktuell auf die Treiber oder CPU, darum will ich wissen was er für eine hat.
Wenn er eine 1Kern P4 hat z.B. wird die glu Operation ein reges Festmahl für die CPU und das Syncen alleine schon dauert ewig.
Dazu kommt oben drauf, dass er sleep nutzt, was ja recht ungenau ist und bei 15ms wartezeit(genauer ist sleep nicht) hat man knapp über 60fps und durch verspätung durch syncen und ausführen von prozessorcode dauert es, bis das sleep aufgerufen wird und daher wird das auf schätze mal 50fps zusammen schrumpfen und je nach cpu dauert das berechnen der ganzen matrizenoperationen länger und dann kommt noch das syncen mit graka, was ihn wohl auf 30-40 fps runter holt.
Sleep ist böse, wenn man viel FPS braucht und eine schwache cpu hat. Unter linux ist das anders usleep ist ein vielfaches genauer :)
Da aber schon 30FPS ohne sleep kommen glaub ich mehr an fehlender graka treiber, blöde settings bei dem delphi projekt(z.B. ein panel mit im form oder ein timer im form, der auch noch ein sleep macht).

edit: Auch mit den FPS zahlen der anderen Projekt, wie er schrieb glaub ich mehr an fehlende Grakatreiber. 500-600FPS ist lächerlich. Ein glxgears test hat auf meinerm AMD X4 gut 800FPS und ein leeres Projektframework von mir macht 5000-6000 FPS auf einer gf8800 mit amd X2 3200+.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Feb 04, 2010 18:39 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Anmerkung: Ich dachte sleep hätte eine Genauigkeit von 55ms, was zu 18 fps führt, weil es auf den Uralttimer aus DOSzeiten (Kompatibilität und so) zurückzuführen ist?

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Feb 04, 2010 18:41 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich benutze Sleep immer in meinen Renderschleifen, mit 1 als Parameter, sonst habe ich 100% CPU-Auslastung. Ich benutze allerdings auch nicht das OnIdle-Event, wo das nicht notwendig sein sollte.

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Feb 04, 2010 23:14 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Wahrscheinlich wurde es inzwischen ab irgendeiner Delphiversion (und bei FP wahrscheinlich schon immer) gepimpt, dass es besser funzt - Delay von TP damals war auf jedenfall mit einer Genauigkeit von 55ms versehen. :lol:

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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.011s | 16 Queries | GZIP : On ]