简体   繁体   English

在 glium 中设置帧重绘率?

[英]Set frame redraw rate in glium?

I am trying to make a game loop using glium in rust.我正在尝试在 rust 中使用 glium 制作游戏循环。 My goal is to get the screen to redraw 60 times per second.我的目标是让屏幕每秒重绘 60 次。 With the current event loop code I have, the frame only gets redrawn when the window size changes.使用我拥有的当前事件循环代码,只有在 window 大小发生变化时才会重绘框架。 I read in the glutin docs, that I need to call request_redraw somewhere, but I'm not sure how/where.我在 glutin docs 中读到,我需要在某个地方调用 request_redraw,但我不确定如何/在哪里。 This is my code so far:到目前为止,这是我的代码:

event_loop.run(move |event, _target, control_flow| match event {
    Event::LoopDestroyed => return,
    Event::WindowEvent {
        window_id: _window_id,
        event: winevent,
    } => match winevent {
        WindowEvent::Resized(physical_size) => display.gl_window().resize(physical_size),
        WindowEvent::CloseRequested => {
            *control_flow = ControlFlow::Exit;
        }
        _ => {}
    },
    Event::RedrawRequested(_window_id) => {
        let mut target = display.draw();
        target.clear_color_srgb(rng.gen(), rng.gen(), rng.gen(), 1.0);
        target.finish().unwrap();
    }
    _ => {}
});

I haven't used glium before (I've been making some graphics applications directly off of Vulkano for a while).我以前没有使用glium (我已经有一段时间直接从Vulkano制作了一些图形应用程序)。 However, perusing the API, it seems you can get your Window handle from winit by going through a series of apis.但是,仔细阅读 API,您似乎可以通过一系列 api 从winit获取 Window 句柄。 I outlined them in the below code.我在下面的代码中概述了它们。 Something like the below should work for you.像下面这样的东西应该适合你。 The key is getting access to the Window handle from winit .关键是从winit访问Window句柄。 Scrolling through the Window API you should see this: request_redraw .滚动浏览Window API 您应该看到: request_redraw You can then insert game-loop logic around your event handler like this:然后,您可以在事件处理程序周围插入游戏循环逻辑,如下所示:

use std::time::Instant;
use glium::Display;
use winit::event_loop::{EventLoop, ControlFlow};
use winit::event::{Event, WindowEvent};
use winit::window::Window;

const TARGET_FPS: u64 = 60;

/* ... some function for main loop ... */

let display: Display = ... /* glium Display instance */

event_loop.run(move |event, _target, control_flow| {
    let start_time = Instant::now();
    match event {
        Event::WindowEvent { event: WindowEvent::CloseRequested, .. } => {
            *control_flow = ControlFlow::Exit;
        },
        ...
    /*
     * Process events here
     */
    }
    match *control_flow {
        ControlFlow::Exit => (),
        _ => {
            /*
             * Grab window handle from the display (untested - based on API)
             */
            display.gl_window().window().request_redraw();
            /*
             * Below logic to attempt hitting TARGET_FPS.
             * Basically, sleep for the rest of our milliseconds
             */
            let elapsed_time = Instant::now().duration_since(start_time).as_millis() as u64;

            let wait_millis = match 1000 / TARGET_FPS >= elapsed_time {
                true => 1000 / TARGET_FPS - elapsed_time,
                false => 0
            };
            let new_inst = start_time + std::time::Duration::from_millis(wait_millis);
            *control_flow = ControlFlow::WaitUntil(new_inst);
        }
    }
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM