在 glium 中设置帧重绘率?
Set frame redraw rate in glium?
我正在尝试使用 glium in rust 制作游戏循环。我的目标是让屏幕每秒重绘 60 次。使用我当前的事件循环代码,只有在 window 大小发生变化时才会重新绘制框架。我在 glutin 文档中读到,我需要在某处调用 request_redraw,但我不确定 how/where。到目前为止,这是我的代码:
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();
}
_ => {}
});
我以前没有使用过 glium
(我已经有一段时间直接使用 Vulkano
制作一些图形应用程序)。但是,仔细阅读 API,您似乎可以通过一系列 API 从 winit
获取 Window 句柄。我在下面的代码中概述了它们。像下面这样的东西应该适合你。关键是从 winit
访问 Window
句柄。滚动 Window
API 您应该看到:request_redraw。然后,您可以像这样在事件处理程序周围插入游戏循环逻辑:
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);
}
}
});
我正在尝试使用 glium in rust 制作游戏循环。我的目标是让屏幕每秒重绘 60 次。使用我当前的事件循环代码,只有在 window 大小发生变化时才会重新绘制框架。我在 glutin 文档中读到,我需要在某处调用 request_redraw,但我不确定 how/where。到目前为止,这是我的代码:
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();
}
_ => {}
});
我以前没有使用过 glium
(我已经有一段时间直接使用 Vulkano
制作一些图形应用程序)。但是,仔细阅读 API,您似乎可以通过一系列 API 从 winit
获取 Window 句柄。我在下面的代码中概述了它们。像下面这样的东西应该适合你。关键是从 winit
访问 Window
句柄。滚动 Window
API 您应该看到:request_redraw。然后,您可以像这样在事件处理程序周围插入游戏循环逻辑:
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);
}
}
});