diff options
Diffstat (limited to 'src/utils/timer.cpp')
-rw-r--r-- | src/utils/timer.cpp | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/src/utils/timer.cpp b/src/utils/timer.cpp new file mode 100644 index 000000000..f6aab825c --- /dev/null +++ b/src/utils/timer.cpp @@ -0,0 +1,122 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2013 The ManaPlus 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 <http://www.gnu.org/licenses/>. + */ + +#include "utils/timer.h" + +#include "SDL_timer.h" + +#include <climits> + +#include "debug.h" + +namespace +{ +#ifdef USE_SDL2 + SDL_TimerID mLogicCounterId(0); + SDL_TimerID mSecondsCounterId(0); +#else + SDL_TimerID mLogicCounterId(nullptr); + SDL_TimerID mSecondsCounterId(nullptr); +#endif +} // 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 int cur_time; + +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++; + 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; + } + else + { + 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; + else + 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); +} |