From af8476c4ba71b3cb55844b3a10698a294253fe0e Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 6 Jan 2022 13:41:51 +0100 Subject: [PATCH] New FPS system, editable in config --- config.yml | 4 ++++ headers/configData.h | 3 +++ src/configManagement.cpp | 2 ++ src/game/gameBasics.cpp | 26 ++++++++++++++------------ 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/config.yml b/config.yml index 24b0bbb..c11844d 100644 --- a/config.yml +++ b/config.yml @@ -1,3 +1,7 @@ +# General configuration +general: + maxFPS: 50 + # Players config players: width: 250 diff --git a/headers/configData.h b/headers/configData.h index 02dd67c..38dae41 100644 --- a/headers/configData.h +++ b/headers/configData.h @@ -10,6 +10,9 @@ typedef string configKey; struct ConfigData { + unsigned maxFPS; + + InvadersGrid grid; unsigned startXPosition; diff --git a/src/configManagement.cpp b/src/configManagement.cpp index 7656bdd..e621bc7 100644 --- a/src/configManagement.cpp +++ b/src/configManagement.cpp @@ -160,6 +160,8 @@ void ConfigBuilder::readInvaderType(const configKey& baseKey, InvaderTypeDef& in void ConfigBuilder::readConfig() { + collectedData.maxFPS = getInt("general.maxFPS"); + readGrid("grid"); // players diff --git a/src/game/gameBasics.cpp b/src/game/gameBasics.cpp index c8a2d86..3fba575 100644 --- a/src/game/gameBasics.cpp +++ b/src/game/gameBasics.cpp @@ -84,14 +84,19 @@ WinValue Game::playGame(){ // returns when game is finished basePos = Position(200, 0); // GAMELOOP - const int MAX_FPS = 60; + // computed in advance for performance reasons + chrono::milliseconds maxFrameTime = chrono::milliseconds(1000/confData.maxFPS); - chrono::milliseconds fpsTime; unsigned tmpFps = 0; unsigned fps = 0; + typedef chrono::high_resolution_clock::time_point MyTimePoint; + MyTimePoint fpsStartTime = {}; while(window.isOpen()){ - chrono::time_point startTime = chrono::high_resolution_clock::now(); + MyTimePoint startTime = chrono::high_resolution_clock::now(); + if(fpsStartTime.time_since_epoch()==chrono::seconds(0)){ + fpsStartTime = startTime; + } pm.startFrame(); @@ -118,19 +123,16 @@ WinValue Game::playGame(){ // returns when game is finished pm.endFrame(); - chrono::time_point endTime = chrono::high_resolution_clock::now(); - chrono::milliseconds frameTime = chrono::duration_cast(endTime-startTime); - fpsTime = fpsTime + frameTime; - if(fpsTime>chrono::seconds(1)){ + MyTimePoint endTime = chrono::high_resolution_clock::now(); + + // This code is counted as part of frames, but that's not really something we can control + if(fpsStartTime+chrono::seconds(1) < endTime){ fps = tmpFps; tmpFps = 0; - fpsTime = chrono::milliseconds(0); + fpsStartTime = {}; }else ++tmpFps; - // old implementation, too volatile -// cout << "FPS : " << chrono::milliseconds(1000)/frameTime << endl; - - this_thread::sleep_until(startTime+chrono::duration>(1)); + this_thread::sleep_until(startTime+maxFrameTime); } return WinValue::NOBODY; }