55 lines
1.4 KiB
C++
55 lines
1.4 KiB
C++
#pragma once
|
|
|
|
#include "idlib/text/str.h"
|
|
|
|
#include <chrono>
|
|
#include <cstdint>
|
|
|
|
class idTimer {
|
|
public:
|
|
enum timerState_t : int { TS_STARTED = 0, TS_STOPPED = 1 };
|
|
|
|
idTimer() : state(TS_STOPPED), start(0), clockTicks(0) {}
|
|
virtual ~idTimer() = default;
|
|
|
|
void Start() { state = TS_STARTED; start = ClockNow(); }
|
|
void Stop() {
|
|
if (state == TS_STARTED) {
|
|
clockTicks += ClockNow() - start;
|
|
state = TS_STOPPED;
|
|
}
|
|
}
|
|
void Clear() { state = TS_STOPPED; start = 0; clockTicks = 0; }
|
|
std::int64_t ClockTicks() const { return clockTicks; }
|
|
double Milliseconds() const { return static_cast<double>(clockTicks) / 1000000.0; }
|
|
|
|
alignas(8) timerState_t state;
|
|
std::int64_t start;
|
|
std::int64_t clockTicks;
|
|
|
|
private:
|
|
static std::int64_t ClockNow() {
|
|
return std::chrono::duration_cast<std::chrono::nanoseconds>(
|
|
std::chrono::steady_clock::now().time_since_epoch()).count();
|
|
}
|
|
};
|
|
|
|
class idJobTimer {
|
|
public:
|
|
idStr name;
|
|
int start;
|
|
int ends;
|
|
};
|
|
|
|
class idSPUTimer {
|
|
public:
|
|
unsigned int startDecr;
|
|
};
|
|
|
|
#if defined(_WIN32) && !defined(_WIN64)
|
|
static_assert(sizeof(idTimer) == 32, "Recovered idTimer ABI changed");
|
|
static_assert(sizeof(idJobTimer) == 40, "Recovered idJobTimer ABI changed");
|
|
static_assert(sizeof(idSPUTimer) == 4, "Recovered idSPUTimer ABI changed");
|
|
#endif
|
|
|