how get fps gpu in rust

To get the FPS (Frames Per Second) of a GPU in Rust, you can use the following approaches:

1. Using the wgpu crate

The wgpu crate is a Rust API for working with graphics processing units (GPUs). Here's an example of how you can use it to get the FPS:

main.rs
use wgpu::{Device, SurfaceConfiguration, SurfaceDescriptor};

async fn get_fps() {
    // Create a new surface configuration
    let surface_config = SurfaceConfiguration {
        usage: wgpu::TextureUsages::RENDER_ATTACHMENT,
        format: wgpu::TextureFormat::Bgra8UnormSrgb,
        width: 1024,
        height: 768,
        present_mode: wgpu::PresentMode::Fifo,
    };

    // Create a new surface descriptor
    let surface_descriptor = SurfaceDescriptor {
        label: None,
        width: 1024,
        height: 768,
    };

    // Create a new device and surface
    let (device, surface) = futures::executor::block_on(async {
        let instance = wgpu::Instance::new(wgpu::Backends::all());
        let surface = unsafe { instance.create_surface(&surface_descriptor) };
        let adapter = instance.request_adapter(wgpu::RequestAdapterOptions {
            power_preference: wgpu::PowerPreference::default(),
            surface: Some(surface.as_ref()),
        }).await.unwrap();
        let (device, queue) = adapter.request_device(
            &wgpu::DeviceDescriptor {
                features: wgpu::Features::empty(),
                limits: wgpu::Limits::default(),
                label: None,
            },
            None,
        ).await.unwrap();
        (device, surface)
    });

    // Configure the surface
    device.configure_surface(&surface, &surface_config);

    // Create a new render pipeline
    let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor {
        label: None,
        layout: None,
        vertex: wgpu::ProgrammableStageDescriptor {
            module: wgpu::ShaderModuleDescriptor {
                label: None,
                source: wgpu::ShaderSource::Wgsl(include_str!("vertex.wgsl").into()),
            },
            entry_point: "main",
        },
        fragment: Some(wgpu::ProgrammableStageDescriptor {
            module: wgpu::ShaderModuleDescriptor {
                label: None,
                source: wgpu::ShaderSource::Wgsl(include_str!("fragment.wgsl").into()),
            },
            entry_point: "main",
        }),
        render_states: vec![],
        primitive: wgpu::PrimitiveState {
            topology: wgpu::PrimitiveTopology::TriangleList,
            ..Default::default()
        },
        multisample: wgpu::MultisampleState {
            count: 1,
            mask: !0,
            alpha_to_coverage_enabled: false,
        },
        depth_stencil: None,
    });

    // Create a new command encoder
    let mut command_encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
        label: None,
    });

    // Render a frame
    {
        let mut render_pass = command_encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
            label: None,
            color_attachments: &[wgpu::RenderPassColorAttachment {
                view: &surface.get_current_texture().unwrap().view,
                resolve_target: None,
                ops: wgpu::Operations {
                    load: wgpu::LoadOp::Clear(wgpu::Color {
                        r: 0.0,
                        g: 0.0,
                        b: 0.0,
                        a: 1.0,
                    }),
                    store: true,
                },
            }],
            depth_stencil_attachment: None,
        });

        render_pass.set_pipeline(&render_pipeline);
        render_pass.draw(0..3, 0..1);
    }

    // Submit the command buffer
    queue.submit(std::iter::once(command_encoder.finish()));

    // Present the frame
    surface.present();

    // Measure the time it took to render the frame
    let start_time = std::time::Instant::now();
    loop {
        // Render frames
        let mut command_encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
            label: None,
        });

        {
            let mut render_pass = command_encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
                label: None,
                color_attachments: &[wgpu::RenderPassColorAttachment {
                    view: &surface.get_current_texture().unwrap().view,
                    resolve_target: None,
                    ops: wgpu::Operations {
                        load: wgpu::LoadOp::Clear(wgpu::Color {
                            r: 0.0,
                            g: 0.0,
                            b: 0.0,
                            a: 1.0,
                        }),
                        store: true,
                    },
                }],
                depth_stencil_attachment: None,
            });

            render_pass.set_pipeline(&render_pipeline);
            render_pass.draw(0..3, 0..1);
        }

        queue.submit(std::iter::once(command_encoder.finish()));
        surface.present();

        // Measure the time it took to render the frame
        let elapsed_time = start_time.elapsed().as_secs_f64();

        // Calculate the FPS
        let fps = 1.0 / elapsed_time;

        // Print the FPS
        println!("FPS: {}", fps);

        // Limit the frame rate to 60 FPS
        std::thread::sleep(std::time::Duration::from_millis(1000 / 60));
    }
}
5187 chars
155 lines

This example uses the wgpu crate to create a window and render a triangle. It then measures the time it takes to render each frame and calculates the FPS.

2. Using the gpu crate

The gpu crate is another Rust API for working with GPUs. Here's an example of how you can use it to get the FPS:

main.rs
use gpu::{Device, Surface, SurfaceConfiguration};

fn main() {
    // Create a new surface configuration
    let surface_config = SurfaceConfiguration {
        width: 1024,
        height: 768,
    };

    // Create a new surface
    let surface = Surface::new(&surface_config);

    // Create a new device
    let device = Device::new();

    // Create a new render pipeline
    let render_pipeline = device.create_render_pipeline();

    // Render frames
    let start_time = std::time::Instant::now();
    loop {
        // Render a frame
        device.render_frame(&render_pipeline, &surface);

        // Measure the time it took to render the frame
        let elapsed_time = start_time.elapsed().as_secs_f64();

        // Calculate the FPS
        let fps = 1.0 / elapsed_time;

        // Print the FPS
        println!("FPS: {}", fps);

        // Limit the frame rate to 60 FPS
        std::thread::sleep(std::time::Duration::from_millis(1000 / 60));
    }
}
972 chars
38 lines

This example uses the gpu crate to create a window and render a frame. It then measures the time it takes to render each frame and calculates the FPS.

3. Using the glam and egl crates

The glam crate is a Rust library for working with graphics, and the egl crate is a Rust API for working with EGL (Embedded-System Graphics Library). Here's an example of how you can use them to get the FPS:

main.rs
use glam::{Vec2, Vec3};
use egl::{Egl, Display, Surface, Context};

fn main() {
    // Create a new EGL display
    let display = Egl::new().unwrap();

    // Create a new EGL surface
    let surface = Surface::new(&display, 1024, 768).unwrap();

    // Create a new EGL context
    let context = Context::new(&display, &surface).unwrap();

    // Make the context current
    context.make_current().unwrap();

    // Create a new render pipeline
    let render_pipeline = egl::create_render_pipeline();

    // Render frames
    let start_time = std::time::Instant::now();
    loop {
        // Render a frame
        egl::render_frame(&render_pipeline, &surface);

        // Measure the time it took to render the frame
        let elapsed_time = start_time.elapsed().as_secs_f64();

        // Calculate the FPS
        let fps = 1.0 / elapsed_time;

        // Print the FPS
        println!("FPS: {}", fps);

        // Limit the frame rate to 60 FPS
        std::thread::sleep(std::time::Duration::from_millis(1000 / 60));
    }
}
1038 chars
39 lines

This example uses the glam and egl crates to create a window and render a frame. It then measures the time it takes to render each frame and calculates the FPS.

related categories

gistlibby LogSnag