| @@ -13,19 +13,9 @@ | |||||
| #include <cstdlib> | #include <cstdlib> | ||||
| #include <stdint.h> | #include <stdint.h> | ||||
| #if __linux__ || __native_client__ || __APPLE__ \ | |||||
| || (HAVE_GETTIMEOFDAY && HAVE_USLEEP && HAVE_SYS_TIME_H && HAVE_UNISTD_H) | |||||
| # include <sys/time.h> | |||||
| # include <unistd.h> | |||||
| #elif _WIN32 | |||||
| # define WIN32_LEAN_AND_MEAN | |||||
| # include <windows.h> | |||||
| # undef WIN32_LEAN_AND_MEAN | |||||
| #elif HAVE_SDL_SDL_H | |||||
| # include <SDL/SDL.h> | |||||
| #else | |||||
| # include <SDL.h> | |||||
| #endif | |||||
| #include <chrono> | |||||
| using namespace std::chrono; | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -41,97 +31,25 @@ class TimerData | |||||
| private: | private: | ||||
| TimerData() | TimerData() | ||||
| { | { | ||||
| Init(); | |||||
| (void)GetSeconds(true); | (void)GetSeconds(true); | ||||
| } | } | ||||
| #if __linux__ || __native_client__ || __APPLE__ \ | |||||
| || (HAVE_GETTIMEOFDAY && HAVE_USLEEP) | |||||
| inline void Init() | |||||
| { | |||||
| m_tv.tv_usec = 0; | |||||
| m_tv.tv_sec = 0; | |||||
| } | |||||
| float GetSeconds(bool reset) | float GetSeconds(bool reset) | ||||
| { | { | ||||
| struct timeval tv, tv0 = m_tv; | |||||
| gettimeofday(&tv, nullptr); | |||||
| steady_clock::time_point tp, tp0 = m_tp; | |||||
| tp = steady_clock::now(); | |||||
| if (reset) | if (reset) | ||||
| m_tv = tv; | |||||
| return 1e-6f * (tv.tv_usec - tv0.tv_usec) + (tv.tv_sec - tv0.tv_sec); | |||||
| m_tp = tp; | |||||
| return duration_cast<duration<float>>(tp - tp0).count(); | |||||
| } | } | ||||
| static void WaitSeconds(float seconds) | static void WaitSeconds(float seconds) | ||||
| { | { | ||||
| if (seconds > 0.0f) | if (seconds > 0.0f) | ||||
| usleep((int)(seconds * 1e6f)); | |||||
| } | |||||
| struct timeval m_tv; | |||||
| #elif _WIN32 | |||||
| inline void Init() | |||||
| { | |||||
| m_cycles.QuadPart = 0; | |||||
| } | |||||
| float GetSeconds(bool reset) | |||||
| { | |||||
| static float secs_per_cycle = GetSecondsPerCycle(); | |||||
| LARGE_INTEGER cycles, cycles0 = m_cycles; | |||||
| QueryPerformanceCounter(&cycles); | |||||
| if (reset) | |||||
| m_cycles = cycles; | |||||
| return secs_per_cycle * (cycles.QuadPart - cycles0.QuadPart); | |||||
| } | |||||
| static void WaitSeconds(float seconds) | |||||
| { | |||||
| if (seconds > 5e-4f) | |||||
| Sleep((int)(seconds * 1e3f + 0.5f)); | |||||
| } | |||||
| static float GetSecondsPerCycle() | |||||
| { | |||||
| LARGE_INTEGER tmp; | |||||
| QueryPerformanceFrequency(&tmp); | |||||
| return 1.f / tmp.QuadPart; | |||||
| } | |||||
| LARGE_INTEGER m_cycles; | |||||
| #else | |||||
| inline void Init() | |||||
| { | |||||
| m_ticks = 0; | |||||
| } | |||||
| float GetSeconds(bool reset) | |||||
| { | |||||
| static bool initialised = Init(); | |||||
| /* The crappy SDL fallback */ | |||||
| Uint32 ticks = SDL_GetTicks(), ticks0 = m_ticks; | |||||
| if (reset) | |||||
| m_ticks = ticks; | |||||
| return 1e-3f * (ticks - ticks0); | |||||
| } | |||||
| static void WaitSeconds(float seconds) | |||||
| { | |||||
| if (seconds > 5e-4f) | |||||
| SDL_Delay((int)(seconds * 1e3f + 0.5f)); | |||||
| } | |||||
| static bool Init() | |||||
| { | |||||
| SDL_Init(SDL_INIT_TIMER); | |||||
| return true; | |||||
| std::this_thread::sleep_for(std::chrono::duration<float>(seconds)); | |||||
| } | } | ||||
| Uint32 m_ticks; | |||||
| #endif | |||||
| steady_clock::time_point m_tp; | |||||
| }; | }; | ||||
| /* | /* | ||||