29 #include YFM_YCLib_Timer
30 #include YFM_YCLib_NativeAPI
32 # include <mmsystem.h>
40 bool bUninitializedTimers(
true);
42 volatile std::uint32_t system_tick;
50 std::uint32_t(*p_tick_getter)();
51 std::uint64_t(*p_tick_getter_nano)();
57 ::LARGE_INTEGER start;
67 ::QueryPerformanceCounter(&now);
68 now.QuadPart -= g_ticks.hi.start.QuadPart;
70 return ::DWORD(now.QuadPart / g_ticks.hi.tps.QuadPart);
74 get_ticks_hi_res_nano()
78 ::QueryPerformanceCounter(&now);
79 now.QuadPart -= g_ticks.hi.start.QuadPart;
80 now.QuadPart *= 1000000000;
81 return now.QuadPart / g_ticks.hi.tps.QuadPart;
87 ::DWORD now(::timeGetTime());
89 return now < g_ticks.start ? (~::DWORD(0) - g_ticks.start) + now
90 : now - g_ticks.start;
96 return get_ticks_mm() * 1000000;
110 ::irqSet(IRQ_TIMER(2), timer_callback);
111 ::irqEnable(IRQ_TIMER(2));
113 TIMER2_CR = TIMER_ENABLE | ::ClockDivider_1;
115 ::timerStart(2, ::ClockDivider_1,
u16(TIMER_FREQ(1000)),
118 if(::QueryPerformanceFrequency(&g_ticks.hi.tps))
120 yunseq(p_tick_getter = get_ticks_hi_res,
121 p_tick_getter_nano = get_ticks_hi_res_nano),
122 ::QueryPerformanceCounter(&g_ticks.hi.start);
126 yunseq(p_tick_getter = get_ticks_mm,
127 p_tick_getter_nano = get_ticks_mm_nano),
128 ::timeBeginPeriod(1);
130 g_ticks.start = ::timeGetTime();
134 # error "Unsupported platform found."
136 bUninitializedTimers = {};
147 return p_tick_getter();
151 ::clock_gettime(CLOCK_MONOTONIC, &now);
152 return now.tv_sec * 1000ULL + now.tv_nsec / 1000000;
161 return system_tick * 1000000ULL + TIMER2_DATA * 1000000ULL / BUS_CLOCK;
163 return p_tick_getter_nano();
167 ::clock_gettime(CLOCK_MONOTONIC, &now);
168 return now.tv_sec * 1000000000ULL + now.tv_nsec;
YF_API void StartTicks()
开始 tick 计时。
#define YB_UNLIKELY(expr)
分支预测提示。
#define yunseq
无序列依赖表达式组求值。
YF_API std::uint64_t GetHighResolutionTicks()
取高精度 tick 数。
YF_API std::uint32_t GetTicks()
取 tick 数。