diff --git a/src/openrct2/Context.cpp b/src/openrct2/Context.cpp index 76146c3e7d..55a83cc559 100644 --- a/src/openrct2/Context.cpp +++ b/src/openrct2/Context.cpp @@ -25,6 +25,7 @@ #include "core/FileScanner.h" #include "core/FileStream.hpp" #include "core/Guard.hpp" +#include "core/Math.hpp" #include "core/MemoryStream.h" #include "core/Path.hpp" #include "core/String.hpp" @@ -361,7 +362,7 @@ namespace OpenRCT2 } network_begin_server(gNetworkStartPort, gNetworkStartAddress); } - #endif // DISABLE_NETWORK +#endif // DISABLE_NETWORK break; } case STARTUP_ACTION_EDIT: @@ -442,23 +443,18 @@ namespace OpenRCT2 } uint32 elapsed = currentTick - _lastTick; - if (elapsed > UPDATE_TIME_MS) - { - elapsed = UPDATE_TIME_MS; - } - _lastTick = currentTick; - _accumulator += elapsed; + _accumulator = Math::Min(_accumulator + elapsed, (uint32)GAME_UPDATE_MAX_THRESHOLD); _uiContext->ProcessMessages(); - if (_accumulator < UPDATE_TIME_MS) + if (_accumulator < GAME_UPDATE_TIME_MS) { - platform_sleep(UPDATE_TIME_MS - _accumulator - 1); + platform_sleep(GAME_UPDATE_TIME_MS - _accumulator - 1); return; } - _accumulator -= UPDATE_TIME_MS; + _accumulator -= GAME_UPDATE_TIME_MS; Update(); if (!_isWindowMinimised && !gOpenRCT2Headless) @@ -480,17 +476,13 @@ namespace OpenRCT2 } uint32 elapsed = currentTick - _lastTick; - if (elapsed > UPDATE_TIME_MS) - { - elapsed = UPDATE_TIME_MS; - } _lastTick = currentTick; - _accumulator += elapsed; + _accumulator = Math::Min(_accumulator + elapsed, (uint32)GAME_UPDATE_MAX_THRESHOLD); _uiContext->ProcessMessages(); - while (_accumulator >= UPDATE_TIME_MS) + while (_accumulator >= GAME_UPDATE_TIME_MS) { // Get the original position of each sprite if(draw) @@ -498,7 +490,7 @@ namespace OpenRCT2 Update(); - _accumulator -= UPDATE_TIME_MS; + _accumulator -= GAME_UPDATE_TIME_MS; // Get the next position of each sprite if(draw) @@ -507,7 +499,7 @@ namespace OpenRCT2 if (draw) { - const float alpha = (float)_accumulator / UPDATE_TIME_MS; + const float alpha = (float)_accumulator / GAME_UPDATE_TIME_MS; sprite_position_tween_all(alpha); drawing_engine_draw(); diff --git a/src/openrct2/Context.h b/src/openrct2/Context.h index ecc6be5596..de28d51995 100644 --- a/src/openrct2/Context.h +++ b/src/openrct2/Context.h @@ -103,15 +103,23 @@ namespace OpenRCT2 IContext * CreateContext(); IContext * CreateContext(IPlatformEnvironment * env, Audio::IAudioContext * audioContext, Ui::IUiContext * uiContext); IContext * GetContext(); - - // The game update inverval in milliseconds, (1000 / 40fps) = 25ms - constexpr uint32 UPDATE_TIME_MS = 25; - // The number of logical update / ticks per second. - constexpr uint32 UPDATE_FPS = 40; } #endif // __cplusplus +enum +{ + // The game update inverval in milliseconds, (1000 / 40fps) = 25ms + GAME_UPDATE_TIME_MS = 25, + // The number of logical update / ticks per second. + GAME_UPDATE_FPS = 40, + // The maximum amount of updates in case rendering is slower + GAME_MAX_UPDATES = 4, + // The maximum threshold to advance. + GAME_UPDATE_MAX_THRESHOLD = GAME_UPDATE_TIME_MS * GAME_MAX_UPDATES, +}; + + #ifdef __cplusplus extern "C" { diff --git a/src/openrct2/game.c b/src/openrct2/game.c index 6022094c00..a72dcc27bc 100644 --- a/src/openrct2/game.c +++ b/src/openrct2/game.c @@ -294,8 +294,8 @@ void game_update() if (gGameSpeed > 1) { numUpdates = 1 << (gGameSpeed - 1); } else { - numUpdates = gTicksSinceLastUpdate / 31; - numUpdates = clamp(1, numUpdates, 4); + numUpdates = gTicksSinceLastUpdate / GAME_UPDATE_TIME_MS; + numUpdates = clamp(1, numUpdates, GAME_MAX_UPDATES); } if (network_get_mode() == NETWORK_MODE_CLIENT && network_get_status() == NETWORK_STATUS_CONNECTED && network_get_authstatus() == NETWORK_AUTH_OK) { diff --git a/src/openrct2/title/TitleSequencePlayer.cpp b/src/openrct2/title/TitleSequencePlayer.cpp index f241a0e5c8..b35f60ca77 100644 --- a/src/openrct2/title/TitleSequencePlayer.cpp +++ b/src/openrct2/title/TitleSequencePlayer.cpp @@ -248,7 +248,7 @@ private: break; case TITLE_SCRIPT_WAIT: // The waitCounter is measured in 25-ms game ticks. Previously it was seconds * 40 ticks/second, now it is ms / 25 ms/tick - _waitCounter = Math::Max(1, command->Milliseconds / UPDATE_TIME_MS); + _waitCounter = Math::Max(1, command->Milliseconds / (uint32)GAME_UPDATE_TIME_MS); break; case TITLE_SCRIPT_LOADMM: {