px8 0.0.4

Open source fantasy console in Rust
use std::collections::VecDeque;
use std::time::Instant;

const HISTORY_SIZE: usize = 128;

pub struct FpsCounter {
    history: VecDeque<f64>,
    last_time: Instant,
}

impl FpsCounter {
    pub fn new() -> FpsCounter {
        FpsCounter {
            history: VecDeque::with_capacity(HISTORY_SIZE),
            last_time: Instant::now(),
        }
    }

    pub fn update(&mut self, current_time: Instant) {
        let delta = current_time - self.last_time;
        let delta_s = delta.as_secs() as f64 + delta.subsec_nanos() as f64 / 1_000_000_000.0;

        self.make_room_for_new_element();
        self.history.push_front(delta_s);

        self.last_time = current_time;
    }

    pub fn get_fps(&self) -> f64 {
        let sum = self.history.iter().fold(0.0, |acc, &item| acc + item);
        self.history.len() as f64 / sum
    }

    fn make_room_for_new_element(&mut self) {
        if self.history.len() >= HISTORY_SIZE {
            let _ = self.history.pop_back();
        }
    }
}