| @@ -13,19 +13,9 @@ | |||
| #include <cstdlib> | |||
| #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 | |||
| { | |||
| @@ -41,97 +31,25 @@ class TimerData | |||
| private: | |||
| TimerData() | |||
| { | |||
| Init(); | |||
| (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) | |||
| { | |||
| struct timeval tv, tv0 = m_tv; | |||
| gettimeofday(&tv, nullptr); | |||
| steady_clock::time_point tp, tp0 = m_tp; | |||
| tp = steady_clock::now(); | |||
| 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) | |||
| { | |||
| 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; | |||
| }; | |||
| /* | |||