/* * The ManaPlus Client * Copyright (C) 2011-2020 The ManaPlus Developers * Copyright (C) 2020-2023 The ManaVerse Developers * * This file is part of The ManaPlus Client. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "utils/timer.h" #include "const/utils/timer.h" PRAGMA48(GCC diagnostic push) PRAGMA48(GCC diagnostic ignored "-Wshadow") #include PRAGMA48(GCC diagnostic pop) #include #include "debug.h" namespace { #ifdef USE_SDL2 SDL_TimerID mLogicCounterId(0); SDL_TimerID mSecondsCounterId(0); #else // USE_SDL2 SDL_TimerID mLogicCounterId(nullptr); SDL_TimerID mSecondsCounterId(nullptr); #endif // USE_SDL2 } // namespace /** * Tells the max tick value, * setting it back to zero (and start again). */ static const int MAX_TICK_VALUE = INT_MAX / 2; volatile int tick_time; /**< Tick counter */ volatile int fps = 0; /**< Frames counted in the last second */ volatile int lps = 0; /**< Logic processed per second */ volatile int frame_count = 0; /**< Counts the frames during one second */ volatile int logic_count = 0; /**< Counts the logic during one second */ volatile time_t cur_time = 0; static uint32_t nextTick(uint32_t interval, void *param A_UNUSED); static uint32_t nextSecond(uint32_t interval, void *param A_UNUSED); /** * Advances game logic counter. * Called every 10 milliseconds by SDL_AddTimer() * @see MILLISECONDS_IN_A_TICK value */ static uint32_t nextTick(uint32_t interval, void *param A_UNUSED) { tick_time = tick_time + 1; if (tick_time == MAX_TICK_VALUE) tick_time = 0; return interval; } /** * Updates fps. * Called every seconds by SDL_AddTimer() */ static uint32_t nextSecond(uint32_t interval, void *param A_UNUSED) { fps = frame_count; lps = logic_count; frame_count = 0; logic_count = 0; return interval; } /** * @return the elapsed time in milliseconds * between two tick values. */ int get_elapsed_time(const int startTime) { const int time = tick_time; if (startTime <= time) { return (time - startTime) * MILLISECONDS_IN_A_TICK; } return (time + (MAX_TICK_VALUE - startTime)) * MILLISECONDS_IN_A_TICK; } int get_elapsed_time1(const int startTime) { const int time = tick_time; if (startTime <= time) return time - startTime; return time + (MAX_TICK_VALUE - startTime); } void startTimers() { // Initialize logic and seconds counters tick_time = 0; mLogicCounterId = SDL_AddTimer(MILLISECONDS_IN_A_TICK, nextTick, nullptr); mSecondsCounterId = SDL_AddTimer(1000, nextSecond, nullptr); } void stopTimers() { SDL_RemoveTimer(mLogicCounterId); SDL_RemoveTimer(mSecondsCounterId); }