From e2761965720e9f5ea938b23133b508731e37511f Mon Sep 17 00:00:00 2001 From: XProger Date: Sat, 18 Jul 2020 17:25:57 +0300 Subject: [PATCH] 30 updates per second (Core::UPS) --- src/core.h | 6 ++++++ src/game.h | 26 +++++++++++++------------- src/platform/win/main.cpp | 34 ++++++++++++++++++++++------------ 3 files changed, 41 insertions(+), 25 deletions(-) diff --git a/src/core.h b/src/core.h index d15f153..e7db117 100644 --- a/src/core.h +++ b/src/core.h @@ -176,6 +176,8 @@ extern void osMutexFree (void *obj); extern void osMutexLock (void *obj); extern void osMutexUnlock (void *obj); +extern int64 osGetCounter (); +extern int64 osGetFrequency (); extern int osGetTimeMS (); extern bool osJoyReady (int index); @@ -229,6 +231,10 @@ enum RenderTargetOp { namespace Core { + enum { + UPS = 30, + }; + struct Mutex { void *obj; diff --git a/src/game.h b/src/game.h index f909888..46a55f7 100644 --- a/src/game.h +++ b/src/game.h @@ -203,17 +203,17 @@ namespace Game { if (Input::lastState[1] == cStart) level->addPlayer(1); } + /* float dt = Core::deltaTime; if (Input::down[ikR]) // slow motion (for animation debugging) Core::deltaTime /= 10.0f; + */ if (Input::down[ikT]) // fast motion for (int i = 0; i < 9; i++) level->update(); level->update(); - - Core::deltaTime = dt; } void quickSave() { @@ -247,17 +247,23 @@ namespace Game { } } + int32 lastFrame = -1; + bool update() { // async load for settings if (Core::settings.version == SETTINGS_READING) return true; - PROFILE_MARKER("UPDATE"); - if (!Core::update()) return false; - float delta = Core::deltaTime; + int32 frame = int32(osGetCounter() * 30L / osGetFrequency()); + int32 frameDelta = frame - lastFrame; + lastFrame = frame; + + if (frameDelta <= 0) { + return false; + } if (nextLevel) { startLevel(nextLevel); @@ -293,15 +299,9 @@ namespace Game { Input::down[ik9] = false; } - if (!level->level.isCutsceneLevel()) - delta = min(0.2f, delta); - - while (delta > EPS) { - Core::deltaTime = min(delta, 1.0f / 30.0f); + Core::deltaTime = 1.0f / Core::UPS; + for (int i = 0; i < frameDelta; i++) { Game::updateTick(); - delta -= Core::deltaTime; - if (Core::resetState) // resetTime was called - break; } return true; diff --git a/src/platform/win/main.cpp b/src/platform/win/main.cpp index dc1cf6e..91c70a3 100644 --- a/src/platform/win/main.cpp +++ b/src/platform/win/main.cpp @@ -47,18 +47,29 @@ void osMutexUnlock(void *obj) { } // timing -int osStartTime = 0; +int64 osCounterStart = 0; +int64 osCounterFrequency = 0; + +int64 osGetCounter() { + LARGE_INTEGER value; + QueryPerformanceCounter(&value); + return value.QuadPart - osCounterStart; +} + +int64 osGetFrequency() { + return osCounterFrequency; +} int osGetTimeMS() { -#ifdef DEBUG - LARGE_INTEGER Freq, Count; - QueryPerformanceFrequency(&Freq); - QueryPerformanceCounter(&Count); - return int(Count.QuadPart * 1000L / Freq.QuadPart); -#else - timeBeginPeriod(0); - return int(timeGetTime()) - osStartTime; -#endif + return int32(osGetCounter() * 1000L / osCounterFrequency); +} + +void initCounter() { + LARGE_INTEGER value; + QueryPerformanceCounter(&value); + osCounterStart = value.QuadPart; + QueryPerformanceFrequency(&value); + osCounterFrequency = value.QuadPart; } // common input functions @@ -929,7 +940,6 @@ int main(int argc, char** argv) { _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE); _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT); _CrtMemCheckpoint(&_msBegin); -//#elif PROFILE #elif PROFILE int main(int argc, char** argv) { #else @@ -1017,7 +1027,7 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi Sound::channelsCount = 0; - osStartTime = Core::getTime(); + initCounter(); touchInit(hWnd); joyInit();