From acc565e47e3df56b7edaee6b07ce2fa00ee031f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Tue, 23 Dec 2025 19:27:32 -0800 Subject: [PATCH] Added bx::Ticks. (#359) --- include/bx/inline/timer.inl | 66 +++++++++++++++++++++++++++++++++++++ include/bx/timer.h | 57 ++++++++++++++++++++++++++++++++ src/timer.cpp | 4 +++ 3 files changed, 127 insertions(+) create mode 100644 include/bx/inline/timer.inl diff --git a/include/bx/inline/timer.inl b/include/bx/inline/timer.inl new file mode 100644 index 0000000..2e77c54 --- /dev/null +++ b/include/bx/inline/timer.inl @@ -0,0 +1,66 @@ +/* + * Copyright 2011-2025 Branimir Karadzic. All rights reserved. + * License: https://github.com/bkaradzic/bx/blob/master/LICENSE + */ + +#ifndef BX_TIMER_H_HEADER_GUARD +# error "Must be included from bx/timer.h!" +#endif // BX_TIMER_H_HEADER_GUARD + +namespace bx +{ + inline Ticks::Ticks(InitNoneTag) + { + } + + inline constexpr Ticks::Ticks(InitZeroTag) + : Ticks(0) + { + } + + inline Ticks::Ticks(InitIdentityTag) + : Ticks(getHPCounter() ) + { + } + + inline constexpr Ticks::Ticks(int64_t _ticks) + : ticks(_ticks) + { + } + + inline constexpr Ticks Ticks::operator+ (Ticks _rhs) const { return Ticks(ticks + _rhs.ticks); } + inline constexpr Ticks Ticks::operator- (Ticks _rhs) const { return Ticks(ticks - _rhs.ticks); } + inline constexpr Ticks Ticks::operator* (float _rhs) const { return Ticks(int64_t(double(ticks * _rhs) ) ); } + inline constexpr Ticks& Ticks::operator+=(Ticks _rhs) { ticks += _rhs.ticks; return *this; } + inline constexpr Ticks& Ticks::operator-=(Ticks _rhs) { ticks -= _rhs.ticks; return *this; } + inline constexpr Ticks& Ticks::operator*=(float _rhs) { ticks = int64_t(double(ticks * _rhs) ); return *this; } + inline constexpr bool Ticks::operator==(Ticks _rhs) const { return ticks == _rhs.ticks; } + inline constexpr bool Ticks::operator!=(Ticks _rhs) const { return ticks != _rhs.ticks; } + inline constexpr bool Ticks::operator< (Ticks _rhs) const { return ticks < _rhs.ticks; } + inline constexpr bool Ticks::operator<=(Ticks _rhs) const { return ticks <= _rhs.ticks; } + inline constexpr bool Ticks::operator> (Ticks _rhs) const { return ticks > _rhs.ticks; } + inline constexpr bool Ticks::operator>=(Ticks _rhs) const { return ticks >= _rhs.ticks; } + + inline Ticks getNow() + { + return Ticks(getHPCounter() ); + } + + inline Ticks getTicksSinceStartup() + { + return Ticks(getNow() - Ticks::s_kStartup); + } + + template + inline constexpr Ty toSeconds(const Ticks& _ticks) + { + return Ty(double(_ticks.ticks * Ticks::s_kInvFreq) ); + } + + template + inline constexpr Ty toMilliseconds(const Ticks& _ticks) + { + return Ty(double(_ticks.ticks * 1000 * Ticks::s_kInvFreq) ); + } + +} // namespace bx diff --git a/include/bx/timer.h b/include/bx/timer.h index 26d3921..4efa76c 100644 --- a/include/bx/timer.h +++ b/include/bx/timer.h @@ -16,6 +16,63 @@ namespace bx /// int64_t getHPFrequency(); + /// Ticks. + struct Ticks + { + /// No default constructor. + Ticks() = delete; + + /// No initialization. + Ticks(InitNoneTag); + + /// Initialize to zero. + constexpr Ticks(InitZeroTag); + + /// Initialize to current time. + Ticks(InitIdentityTag); + + /// Initialize to specific time in ticks. + explicit constexpr Ticks(int64_t _ticks); + + /// Binary arithmetic operators. + constexpr Ticks operator+ (Ticks _rhs) const; + constexpr Ticks operator- (Ticks _rhs) const; + constexpr Ticks operator* (float _rhs) const; + constexpr Ticks& operator+=(Ticks _rhs); + constexpr Ticks& operator-=(Ticks _rhs); + constexpr Ticks& operator*=(float _rhs); + + /// Comparison operators. + constexpr bool operator==(Ticks _rhs) const; + constexpr bool operator!=(Ticks _rhs) const; + constexpr bool operator< (Ticks _rhs) const; + constexpr bool operator<=(Ticks _rhs) const; + constexpr bool operator> (Ticks _rhs) const; + constexpr bool operator>=(Ticks _rhs) const; + + static const Ticks s_kStartup; //!< App start time. + static const Ticks s_kFreq; //!< Frequency, ticks per second. + static const double s_kInvFreq; //!< 1.0/s_kFreq + + int64_t ticks; //!< Timer ticks. + }; + + /// Returns current time. + Ticks getNow(); + + /// Returns time since app startup. + Ticks getTicksSinceStartup(); + + /// Returns time in seconds. + template + constexpr Ty toSeconds(const Ticks& _time); + + /// Returns time in milliseconds. + template + constexpr Ty toMilliseconds(const Ticks& _time); + } // namespace bx +#include "inline/timer.inl" + #endif // BX_TIMER_H_HEADER_GUARD diff --git a/src/timer.cpp b/src/timer.cpp index 5dc3cc5..77dbb61 100644 --- a/src/timer.cpp +++ b/src/timer.cpp @@ -68,4 +68,8 @@ namespace bx #endif // BX_PLATFORM_ } + const Ticks Ticks::s_kStartup = getNow(); + const Ticks Ticks::s_kFreq = Ticks(getHPFrequency() ); + const double Ticks::s_kInvFreq = 1.0/double(Ticks::s_kFreq.ticks); + } // namespace bx