summaryrefslogtreecommitdiff
path: root/src/utils/timer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/timer.cpp')
-rw-r--r--src/utils/timer.cpp122
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);
+}