Samples never trimmed away regardless of
age (default 2 — the minimum getFPS()/span() need to report
anything at all; see the class comment). CLAMPED to at least 2:
the retention floor is a correctness invariant, not a preference,
and a caller passing 0 or 1 would silently restore the
undefined-estimate failure it exists to prevent. A NON-FINITE
value is treated as ABSENT and falls back to the default before
the clamp (Math.max propagates NaN, and Infinity would mean
"never trim" — an unbounded window that is no longer sliding).
PrivatetimestampsPrivatestartPrivate ReadonlyminPrivate ReadonlywindowSliding sample window (frames older than
newest - windowMs fall out of the estimate)
Newest recorded timestamp, or null when the window is empty.
Record a frame timestamp and trim samples older than the window,
stopping at minRetainedSamples so a frame rate slower than the
window itself still yields a defined estimate.
Interval-normalized FPS over the current window; 0 when fewer than two samples (or a degenerate non-positive span) — callers treat 0 as "not enough data to decide".
Number of samples currently inside the window.
Time covered by the in-window samples, ms (0 with <2 samples).
Drop all samples (pause, native-DPR change, gap reset).
Sliding sample window (frames older than
newest - windowMsfall out of the estimate)