Expand description


Frames Per Second counter for embedded devices.

Create an FPS struct by passing the MAX_FPS (maximum frames per seconds) that you expect to hit and a embedded_time::Clock implementation.


Frames Per Second with a simple for-loop

You can also run this example from the examples directory using:

cargo run --features=std --example fps_counter

use embedded_fps::{FPS, StdClock};
use std::{thread::sleep, time::Duration};

let std_clock = StdClock::default();
let mut fps_counter = FPS::<10, _>::new(std_clock);

for i in 0..20 {
    // sleep for 125 milliseconds
    // this will give us 8 FPS

    let fps = fps_counter.tick();
    println!("Frames per second: {fps}")

Frames Per Second with embedded-graphics

This crate is suitable for usage with the embedded-graphics crate when you want to know, log or even show the frames per second of a display with an embedded device.

Note: This example requires embedded-graphics-simulator and SDL2 installed on your machine.

Refer to the embedded-graphics-simulator documentation for detailed instructions.

You can also run this example from the examples directory using:

cargo run --features=std --example fps_counter

use embedded_fps::{StdClock, FPS};
use embedded_graphics::{
    mono_font::{ascii::FONT_10X20, MonoTextStyle},
    prelude::{Point, Size},
use embedded_graphics_simulator::{
    OutputSettingsBuilder, SimulatorDisplay, SimulatorEvent, Window,

pub const DISPLAY_360P: Size = Size::new(480, 360);

fn main() -> Result<(), core::convert::Infallible> {
    let mut display = SimulatorDisplay::<BinaryColor>::new(DISPLAY_360P);

    let output_settings = OutputSettingsBuilder::new().scale(1).build();
    let mut window = Window::new("FPS using embedded-graphics & simulator", &output_settings);

    // starts the StdClock
    // `200` MAX_FPS is more than enough since `SimulatorDisplay`
    // doesn't reach more than `15` FPS when using `BinaryColor`.
    let mut fps_counter = FPS::<200, StdClock>::default();
    // create an initial value for FPS
    let mut fps = 0;

    'running: loop {

        let character_style = MonoTextStyle::new(&FONT_10X20, BinaryColor::On);
        let fps_position = Point::new(20, 30);

        Text::new(&format!("FPS: {fps}"), fps_position, character_style).draw(&mut display)?;


        if window.events().any(|e| e == SimulatorEvent::Quit) {
            break 'running Ok(());

        // tick and update the FPS at the end of the loop
        fps = fps_counter.tick();

Crate features

  • std - enables StdClock - a [Clock] implementation using std for usage on a host machine.


Measures Frames Per Second (FPS).

A Standard clock based on std.


The errors that FPS can return.