Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
void AppManager::FramebasedRendering(void) { static Ogre::Timer Timer; //Framebased rendering: if (TimePerFrame > 0.0) { while (Timer.getMilliseconds() < TimePerFrame) Sleep(1); TimePassed = TimePerFrame / 1000.0; } else TimePassed = double(Timer.getMilliseconds()) / 1000.0; Timer.reset(); } |
Zitat von »"LagRange"«
Es geht hauptsächlich darum dass aufwändigere Physikinteraktionen die Framerate ganz schön drücken können. Man spart einiges an Rechenzeit wenn man die nicht so oft aufruft.
Administrator
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
const int STEP_SIZE = 20; // 50 fps int timeToProcess = 0; bool render = true; while(!quit) { int t0 = ZEIT_MESSEN(); bool rendered = false; if(render) { RENDERN(); render = false; rendered = true; } while(timeToProcess >= STEP_SIZE) { UPDATE(); timeToProcess -= STEP_SIZE; render = true; // rendern, da Update erfolgte } int dt = ZEIT_MESSEN() - t0; timeToProcess += dt; // Zeitkonto nach oben hin begrenzen if(timeToProcess > MAX_TIME) timeToProcess = MAX_TIME; if(rendered) SZENE_ANZEIGEN(); // Hier kann ein Sleep(0) nicht schaden, damit die Anwendung // nicht 100% CPU-Last erzeugt. Sleep(0); } |
Zitat von »"rewb0rn"«
Zitat von »"LagRange"«
Es geht hauptsächlich darum dass aufwändigere Physikinteraktionen die Framerate ganz schön drücken können. Man spart einiges an Rechenzeit wenn man die nicht so oft aufruft.
eben deswegen habe ich konstante framezeiten. für welche anderen elemente lohnen sich zusätzliche berechnungen?
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 |
const float fUpdatePeriod = 1.f / 30.f; while(!bQuit) { m_fTime += fDeltaTime; if(fLastUpdate + fUpdatePeriod <= m_fTime) { //move, render und present fLastUpdate = m_fTime; } } |
Administrator
Zitat von »"Black-Panther"«
@David
Mulitplizierst du jetzt GAR nichts mehr mit der Zeit??
Zitat von »"Black-Panther"«
Und warum machst du es nicht einfach so:
(...)
Zitat
2. Ich mache es mittlerweile immer so: Die Spiellogik läuft mit einer festen Framerate, z.B. 50 fps. Nur so kann man wirklich garantieren, dass bei gleicher Eingabe auch immer dasselbe Ergebnis rauskommt. Das funktioniert nicht, wenn man es so macht wie ich in meinem Buch und alle Bewegungen mit der vergangenen Zeit multipliziert. Außerdem funktionieren Physik-Engines auch am besten, wenn man sie mit festen Zeitschritten arbeiten lässt.
Ich habe ein "Zeitkonto", das die Anzahl der noch zu verarbeitenden Millisekunden speichert.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
const int STEP_SIZE = 20; // 50 fps int timeToProcess = 0; bool render = true; while(!quit) { int t0 = ZEIT_MESSEN(); bool rendered = false; if(render) { RENDERN(); //Hier werden die Polygone gerendert aber noch nciht angezeigt oder? render = false; rendered = true; } while(timeToProcess >= STEP_SIZE) //muss das nicht <= heißen? weil hier wird ja solange geupdated bis die stepsize erreicht ist. wenn ich das richtig verstehe^^ { UPDATE(); timeToProcess -= STEP_SIZE; //warum zieht man hier die step size ab? render = true; // rendern, da Update erfolgte } int dt = ZEIT_MESSEN() - t0; timeToProcess += dt; // Zeitkonto nach oben hin begrenzen if(timeToProcess > MAX_TIME) timeToProcess = MAX_TIME; if(rendered) SZENE_ANZEIGEN(); //Warum trennst du rendern und anzeigen? // Hier kann ein Sleep(0) nicht schaden, damit die Anwendung // nicht 100% CPU-Last erzeugt. Sleep(0); } |
Administrator
Administrator
Werbeanzeige