载入中...
搜索中...
未找到
Time.h
浏览该文件的文档.
1#pragma once
2
12#include "common/Export.h"
13#include "common/Result.h"
14#include "common/StrongUint64.h"
15
16#include <compare>
17#include <cstdint>
18#include <optional>
19#include <vector>
20
21namespace eve {
22
23namespace detail {
27struct FrameIndexTag {};
28} // namespace detail
29
32
35
44public:
46 constexpr Duration() noexcept = default;
47
52 explicit constexpr Duration(std::int64_t nanoseconds) noexcept : nanoseconds_(nanoseconds) {}
53
55 [[nodiscard]] static constexpr Duration fromNanoseconds(std::int64_t nanoseconds) noexcept {
56 return Duration(nanoseconds);
57 }
58
60 [[nodiscard]] static constexpr Duration zero() noexcept { return {}; }
61
66 [[nodiscard]] static Result<Duration> fromSeconds(double seconds);
67
69 [[nodiscard]] constexpr std::int64_t nanoseconds() const noexcept { return nanoseconds_; }
70
72 [[nodiscard]] double seconds() const noexcept;
73
75 [[nodiscard]] constexpr bool isZero() const noexcept { return nanoseconds_ == 0; }
76
81 [[nodiscard]] Result<Duration> tryAdd(Duration other) const;
82
87 [[nodiscard]] Result<Duration> scaled(double rate) const;
88
89 friend constexpr bool operator==(Duration, Duration) noexcept = default;
91 friend constexpr auto operator<=>(Duration, Duration) noexcept = default;
92
93private:
94 std::int64_t nanoseconds_ = 0;
95};
96
105public:
107 constexpr MonotonicTimestamp() noexcept = default;
108
110 explicit constexpr MonotonicTimestamp(std::int64_t nanoseconds) noexcept : nanoseconds_(nanoseconds) {}
111
113 [[nodiscard]] static constexpr MonotonicTimestamp zero() noexcept { return {}; }
114
116 [[nodiscard]] constexpr std::int64_t nanoseconds() const noexcept { return nanoseconds_; }
117
122 [[nodiscard]] Result<Duration> since(MonotonicTimestamp earlier) const;
123
124 friend constexpr bool operator==(MonotonicTimestamp, MonotonicTimestamp) noexcept = default;
126 friend constexpr auto operator<=>(MonotonicTimestamp, MonotonicTimestamp) noexcept = default;
127
128private:
129 std::int64_t nanoseconds_ = 0;
130};
131
139public:
141 constexpr WallClockTimestamp() noexcept = default;
142
144 explicit constexpr WallClockTimestamp(std::int64_t unixNanoseconds) noexcept : unixNanoseconds_(unixNanoseconds) {}
145
147 [[nodiscard]] constexpr std::int64_t unixNanoseconds() const noexcept { return unixNanoseconds_; }
148
149 friend constexpr bool operator==(WallClockTimestamp, WallClockTimestamp) noexcept = default;
151 friend constexpr auto operator<=>(WallClockTimestamp, WallClockTimestamp) noexcept = default;
152
153private:
154 std::int64_t unixNanoseconds_ = 0;
155};
156
160 SimulationTick tick = SimulationTick::zero();
162 Duration delta = Duration::zero();
163};
164
174public:
175 static constexpr const char* capabilityName = "ITimeSource";
177 virtual ~ITimeSource() = default;
178
183 [[nodiscard]] virtual MonotonicTimestamp monotonicNow() const = 0;
184
189 [[nodiscard]] virtual WallClockTimestamp wallClockNow() const = 0;
190};
191
202public:
208 explicit SimulationClock(ITimeSource& source, Duration fixedStep = Duration::fromNanoseconds(16666667));
209
211 [[nodiscard]] Result<std::vector<SimulationStep>> sample();
212
218 [[nodiscard]] Result<std::vector<SimulationStep>> advance(Duration realDelta);
219
221 [[nodiscard]] Result<void> setFixedStep(Duration fixedStep);
223 [[nodiscard]] Result<void> setRate(double rate);
225 void setPaused(bool paused) noexcept { paused_ = paused; }
226
228 void reset(SimulationTick tick = SimulationTick::zero()) noexcept;
229
231 [[nodiscard]] SimulationTick currentTick() const noexcept { return tick_; }
233 [[nodiscard]] FrameIndex frameIndex() const noexcept { return frame_; }
235 [[nodiscard]] Duration fixedStep() const noexcept { return fixedStep_; }
237 [[nodiscard]] double rate() const noexcept { return rate_; }
239 [[nodiscard]] bool paused() const noexcept { return paused_; }
241 [[nodiscard]] Duration lastFrameDelta() const noexcept { return lastFrameDelta_; }
242
243private:
244 ITimeSource& source_;
245 Duration fixedStep_;
246 Duration accumulator_;
247 Duration lastFrameDelta_;
248 double rate_ = 1.0;
249 SimulationTick tick_ = SimulationTick::zero();
250 FrameIndex frame_ = FrameIndex::zero();
251 bool paused_ = false;
252 std::optional<MonotonicTimestamp> previousSourceTime_;
253};
254
255} // namespace eve
#define EVENGINE_API_FOUNDATION_INLINE
仅供"只有内联成员"的类型使用的组宏:拥有者 dllexport,消费方不导入。
Definition Export.h:170
#define EVENGINE_API_FOUNDATION
每个链接组(link group)各自的导出宏。
Definition Export.h:106
int detail
Move-only, checked operation results for the common layer.
Internal storage primitive for domain-owned unsigned values.
SimulationTick tick
const UnitySourceAsset & source
Signed, fixed-resolution simulation duration in nanoseconds.
Definition Time.h:43
constexpr std::int64_t nanoseconds() const noexcept
Return the exact signed nanosecond representation.
Definition Time.h:69
friend constexpr bool operator==(Duration, Duration) noexcept=default
static constexpr Duration fromNanoseconds(std::int64_t nanoseconds) noexcept
Construct an exact duration from nanoseconds.
Definition Time.h:55
constexpr Duration() noexcept=default
Construct a zero duration.
static constexpr Duration zero() noexcept
Return zero duration.
Definition Time.h:60
friend constexpr auto operator<=>(Duration, Duration) noexcept=default
Operator <=>.
Injectable source for elapsed and metadata time.
Definition Time.h:173
virtual MonotonicTimestamp monotonicNow() const =0
Read the non-decreasing source-relative timestamp.
virtual ~ITimeSource()=default
I time source.
virtual WallClockTimestamp wallClockNow() const =0
Read wall-clock metadata.
Timestamp from a monotonic source.
Definition Time.h:104
friend constexpr auto operator<=>(MonotonicTimestamp, MonotonicTimestamp) noexcept=default
Operator <=>.
friend constexpr bool operator==(MonotonicTimestamp, MonotonicTimestamp) noexcept=default
static constexpr MonotonicTimestamp zero() noexcept
Return the zero timestamp.
Definition Time.h:113
constexpr std::int64_t nanoseconds() const noexcept
Return source-relative nanoseconds.
Definition Time.h:116
constexpr MonotonicTimestamp() noexcept=default
Construct the zero timestamp.
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Owner-thread fixed-step scheduler driven by an injected time source.
Definition Time.h:201
double rate() const noexcept
Current slow-motion rate.
Definition Time.h:237
void setPaused(bool paused) noexcept
Pause or resume simulation accumulation.
Definition Time.h:225
bool paused() const noexcept
Whether simulation accumulation is paused.
Definition Time.h:239
Duration fixedStep() const noexcept
Fixed duration of emitted simulation steps.
Definition Time.h:235
FrameIndex frameIndex() const noexcept
Current presentation frame ordinal.
Definition Time.h:233
Duration lastFrameDelta() const noexcept
Real source duration observed during the last frame.
Definition Time.h:241
Wall-clock timestamp used only for metadata and diagnostics.
Definition Time.h:138
constexpr std::int64_t unixNanoseconds() const noexcept
Return Unix-epoch nanoseconds for metadata serialization.
Definition Time.h:147
friend constexpr auto operator<=>(WallClockTimestamp, WallClockTimestamp) noexcept=default
Operator <=>.
friend constexpr bool operator==(WallClockTimestamp, WallClockTimestamp) noexcept=default
constexpr WallClockTimestamp() noexcept=default
Construct the Unix epoch timestamp.
Build metadata (engine git commit, build time, third-party version).
Definition Build.cpp:16
One deterministic fixed-step emitted by SimulationClock.
Definition Time.h:158
FrameIndexTag public API.
Definition Time.h:27
SimulationTickTag public API.
Definition Time.h:25