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

Aktuelle Zeit: Mo Jul 07, 2025 20:03

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



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 13, 2003 21:14 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 16:47
Beiträge: 35
Wohnort: Bielefeld
Hi@ll
wenn mein Programm läuft ist meine CPU auslastung immer auf 100%. das liegt glaub ich daran, dass opengl soviele frames wie möglich machen will. soviele brauch ich nicht, nur ca 25. wie kann ich das auf max 25 fps einstellen???

_________________
Ich bin n00b und das ist auch gut so!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 13, 2003 21:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Auch wenn mans normalerweise nicht macht (weil sinnlos) :
Benutz einen Timer, der 25 mal pro Sekunde aktualisiert wird (Intervall=40ms), und zeichne deine Szene dort.Dann hast du nämlich maximal 25 FPS.

Allerdings macht eine künstliche Begrenzung der FPS eigentlich keinen Sinn, und selbst wernn dein OpenGL-Programm 100% Prozessorauslastung hat, ist Windows durchaus noch in der Lage andere Programme zu aktualisieren!

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 13, 2003 21:33 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 16:47
Beiträge: 35
Wohnort: Bielefeld
es geht mir nicht darum ob mein prozi es schafft nebenbei andere programme laufen zu lassen sondern dass er durch die 100%ige auslastung warm wird....

_________________
Ich bin n00b und das ist auch gut so!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 13, 2003 22:54 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Mai 31, 2003 23:59
Beiträge: 42
Son of Satan hat geschrieben:
Allerdings macht eine künstliche Begrenzung der FPS eigentlich keinen Sinn [...].

Klar macht das Sinn. Weil dadurch, dass man die Frames konstant auf einm Niveau hällt, sind Animationen immer gleich schnell und die Tasten haben auch immer die gleiche Wiederholung. Natürlich bringt das nichts, wenn die Framerate noch tiefer geht, aber da es dann ja ruckelt will man das eh vermeiden.

Mir ist natürlich klar, dass man das später viel besser und schöner machen kann. Aber bestimmt nicht so einfach, also ist das für nen Anfänger eigentlich erstmal ideal. B)

_________________
"OpenGL verbindet"<br>- für die Völkerverständigung zwischen Delphi und C++ ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 13, 2003 23:00 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Zitat:
Klar macht das Sinn. Weil dadurch, dass man die Frames konstant auf einm Niveau hällt, sind Animationen immer gleich schnell und die Tasten haben auch immer die gleiche Wiederholung. Natürlich bringt das nichts, wenn die Framerate noch tiefer geht, aber da es dann ja ruckelt will man das eh vermeiden.


Und dafür gibts ja TimeBasedMovement, das Bewegungen, Animationen und Eingabe unabhängig von der Framerate macht...und selbst durch eine Drosselung der Framerate kommt man da nicht herum, denn wenn man seine FPS mittels eines Timers künstlich auf 25FPS drosselt, dann hat man (wie du ja selbst erwähnt hast) noch lange keine Garantie das diese 25FPS immer gehalten werden.
Wenn dies dann nämlich nicht mehr der Fall ist, dann sind Animationen und Co auch nicht mehr unabhängig.

Und die vier Zeilen Quellcode die zur Implementation frameunaghängiger Bewegungen bzw. Animationen nötig sind, sind recht popelig (siehe dazu auch mein Bombermantut Nr.2)...

Zitat:
Mir ist natürlich klar, dass man das später viel besser und schöner machen kann. Aber bestimmt nicht so einfach, also ist das für nen Anfänger eigentlich erstmal ideal.


Eher im Gegenteil, denn wenn man sich erstmal sowas angewöhnt hat, dann wird mans schwer wieder los.Man sollte sich deshalb direkt von Anfang an mit einem echten Renderloop (der noch besser als der Idle-Timer ist) auseinandersetzen, und diesen durch Timebasedmovement erweitern...



P.S. : Wie du aus noob2keys letztem Posting herauslesen kannst, gehts ihm um was ganz anderes.Allerdings machen die paar Grad die die CPU durch einen niedrigere CPU-Auslastung weniger erhitzt kaum was aus...moderne CPUs dürften selbst bei recht hohen Temperaturen knapp 10 Jahre durchalten.
Sinn macht das was er will allerdings auf Notebooks, die die CPU je nach Auslastung drosseln und so vor allem die Batterien entlasten!

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 13, 2003 23:21 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 16:47
Beiträge: 35
Wohnort: Bielefeld
hmmm irgendwie will das nicht...
wo muss ich was einfügen???

hab eine variable namens Timer vom typ TTimer erstelt. nun weiss ich nicht was ich damit machen muss ;(

plz help

wo gibts den tuts zu TimeBasedMovement??
aso im bomberman tut...ma anschauen

_________________
Ich bin n00b und das ist auch gut so!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 13, 2003 23:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Wenn du die VCL nutzt, dann kannste doch ganz einfach die entsprechende Timer-Komponenten auf deine Form ziehen, und in deren OnTimer-Event deine Zeichenroutine unterbringen.

Wenn du jedoch API proggst, dann musste deine TTimer-Variable von Hand erstellen (Create), und mittels CallBack die Routine festlegen die im OnTimer-Event aufgerufen wird (TTimer.OnTimer := NameDerCallBackRoutine).In diese selbstgeschriebene Callbackroutine kommt dann deine Zeichenroutine rein.Wenn du damit allerdings schon Probleme hast, dann empfehl ich dir erstmal dir entsprechende Delphikenntnisse anzugeinen, bevor du dich ernsthaft mit OpenGL beschäftigst.

Zitat:
wo gibts den tuts zu TimeBasedMovement??


Musst nur die Augen aufmachen!Oben hab ich doch schon gesagt, das ich dazu was in meinem zweiten Bombermantut geschrieben hab, und dort wirds auch ausreichend erklärt.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 13, 2003 23:31 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 16:47
Beiträge: 35
Wohnort: Bielefeld
kk sry...habs auch vorhin bemerkt ;P

_________________
Ich bin n00b und das ist auch gut so!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 14, 2003 00:32 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Alternativ kannst du dein Programm vor (oder nach) dem Aufruf deiner Rendermethode mit Sleep eine einstellbare Anzahl von Millisekunden nichts tun lassen, was mir fast eleganter vorkommt als die Timermethode, als du es dann z.B. über Programmeinstellungen dem Anwender überlassen kannst, ob er nun viele Frames haben will, oder ein kühles Notebook ;) .

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 14, 2003 07:10 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 08:09
Beiträge: 98
AHHHHH!

Mit dem Timer das würd ich gleich lassen...
Ich würd ne Schleife machen und dann, wenn es nicht anders geht halt ne Framebremse (ich glaube Mars meint das) einbauen...


Code:
  1.  
  2. procedure wasauchimmer;
  3. var fstart,fend:integer; // ich mein es ging auch longword...
  4. begin
  5. repeat
  6.  fstart:=gettickcount; // "Startzeit" des Frames
  7.  //Zeichnen, Berechnen etc.
  8.  fend:=gettickcount; // "Endzeit"
  9.  while fend-fstart<25 do fend:=gettickcount; // So lange wiederholen bis die Differenz zwischen fend und fstart < 10
  10. Millisekunden ist.
  11. until stop
  12. end;
  13.  


Dieses "TimeBasedMovement" ist das nicht einfach die für das jeweilige Frame verbrauchte Zeit berechnen und dann die Bewegungen damit multiplizieren?


mfg las

_________________
www.las.eu.tc


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 14, 2003 10:10 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
@las

Damit wird nicht die Prozessorlast reduziert, da staendig die Schleife durchlaufen wird. Die bessere Mehtode ist die von Mars vorgschlagene. Der Vorteil bei Sleep ist, das das Betriebssystem für das Aufwecken des Prozesses zustaendig ist und somit anderen Prozessen die Prozessorzeit zuteilt.

Um eine Konstante Framerate, z. B. 25 FPS, zu bekommen, ermittelt man die Dauer des gerade gezeichneten Frames und zieht diesen Wert von 40ms ab. Diesen Wert uebergibt man der Funktion Sleep und damit dauert jeder Frame gleich lang. Falls der Wert negativ wird, wird die Funktion Sleep nicht aufgerufen.

KidPaddle

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 14, 2003 10:17 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Da kommt mir grad ne viel besser Lösung, die auch bei z.B. 3D Studio MAX verwendet wird :

Man zeichnet die Szene nur dann erneut, wenn sich etwas geändert hat.Wenn also der Nutzer z.B. auf nen Button drückt um ne neue Linie einzufügen, dann wird die Zeichenroutine nur einmal aufgerufen und der hintere Puffer nach vorne gebracht.Bei Animationen wird das natürlich nicht mehr klappen, da man dort ja doch ne relativ flüssige Animation will, da muss dann entweder die Sache mit Sleep oder ein Timer heralten.

Durch dieses manuelle Zeichnen der Szene wird noch sehr viel mehr Rechenleistung gespart, als dies bei einer künstlichen Begrenzung der Framerate der Fall wär...3D Studio MAX hat dadurch meist 0% Prozessorlast, da die Szene dort nur neu gezeichnet wird, wenn man z.B. neue Objekte hinzufügt, Objekte verändert oder die Ansicht ändert!

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 14, 2003 10:17 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 08:09
Beiträge: 98
Wenn ich Sleep(40) mach, und sich dann die Geschwindikeit bei der Berechnung verändert, haben die Frames keine konstante Speed mehr!

_________________
www.las.eu.tc


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 14, 2003 13:36 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
@las

Deswegen habe ich geschrieben, das die Zeit zum zeichnen des Frames gemessen und dann von der 40 abgezogen werden soll.

Gruß
KidPaddle

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 14, 2003 15:59 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 08:09
Beiträge: 98
Ich sollte genauer lesen :blink:

Ich erinnere mich noch an Versuche mit "Sleep" in einer Schleife... da ging die CPU Auslastung aber kein bisschen runter...

_________________
www.las.eu.tc


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


Wer ist online?

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.

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