use std::time::{Duration, Instant};
use serde::Serialize;
pub struct Stats {
start: Instant,
emulation: Duration,
video: Duration,
audio: Duration,
last_tick: Instant,
}
impl Stats {
pub fn new() -> Self {
let now = Instant::now();
Self {
start: now,
emulation: Duration::ZERO,
video: Duration::ZERO,
audio: Duration::ZERO,
last_tick: now,
}
}
pub fn tick(&mut self, video_active: bool, audio_active: bool) {
let now = Instant::now();
let elapsed = now - self.last_tick;
self.last_tick = now;
self.emulation += elapsed;
if video_active {
self.video += elapsed;
}
if audio_active {
self.audio += elapsed;
}
}
pub fn reset_tick(&mut self) {
self.last_tick = Instant::now();
}
pub fn report(&self) -> StatsReport {
let to_secs = |d: Duration| d.as_secs_f64().round() as u64;
StatsReport {
video_secs: to_secs(self.video),
audio_secs: to_secs(self.audio),
emulation_secs: to_secs(self.emulation),
wall_secs: to_secs(self.start.elapsed()),
}
}
}
#[derive(Serialize, PartialEq, Eq)]
pub struct StatsReport {
pub video_secs: u64,
pub audio_secs: u64,
pub emulation_secs: u64,
pub wall_secs: u64,
}