1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
//! Rolling frame-time statistics for game loops and real-time applications.
//!
//! `framepace` tracks per-frame wall-time durations in a fixed-size ring
//! buffer and exposes mean, min, max, and percentile (p50, p95, p99)
//! statistics over the window. There is no rendering, no rate-limiting, and
//! no loop control — just measurement.
//!
//! # Quick start
//!
//! ```rust
//! use framepace::FrameTimer;
//!
//! let mut timer: FrameTimer = FrameTimer::new();
//!
//! // At the top of every tick:
//! timer.begin_frame();
//!
//! // Query at any point:
//! if let Some(stats) = timer.stats() {
//! println!("fps={:.1} avg={:.2}ms p95={:.2}ms", stats.fps, stats.avg_ms, stats.p95_ms);
//! }
//! ```
//!
//! # Named phases
//!
//! Break down where time goes within a frame using RAII phase guards:
//!
//! ```rust
//! use framepace::FrameTimer;
//!
//! let mut timer: FrameTimer = FrameTimer::new();
//! timer.begin_frame();
//!
//! {
//! let _update = timer.phase("update");
//! // ... update logic ...
//! } // guard drops here, recording the elapsed time
//!
//! {
//! let _render = timer.phase("render");
//! // ... render logic ...
//! }
//!
//! if let Some(stats) = timer.phase_stats("render") {
//! println!("render p95={:.2}ms", stats.p95_ms);
//! }
//! ```
//!
//! # Custom time sources
//!
//! The default [`DefaultTime`] uses [`std::time::Instant`]. Implement
//! [`TimeSource`] to use a higher-precision clock (e.g. TSC via the `quanta`
//! crate) or to adapt to platforms where `Instant` is unavailable:
//!
//! ```rust
//! use framepace::{FrameTimer, TimeSource};
//!
//! struct QuantaTime;
//!
//! impl TimeSource for QuantaTime {
//! fn now_us() -> u64 {
//! // e.g. quanta::Instant::now().as_u64() / 1_000
//! 0 // placeholder
//! }
//! }
//!
//! let mut timer: FrameTimer<64, QuantaTime> = FrameTimer::new();
//! timer.begin_frame();
//! ```
pub use PhaseGuard;
pub use FrameStats;
pub use ;
pub use ;