Rust lang thread::sleep() 在 windows 的游戏循环中休眠时间几乎是指定时间的两倍
Rust lang thread::sleep() sleeping for almost twice the specified time during game loop on windows
所以我编写了以下函数来说明我的意思:
use std::{thread, time};
const TARGET_FPS: u64 = 60;
fn main() {
let mut frames = 0;
let target_ft = time::Duration::from_micros(1000000 / TARGET_FPS);
println!("target frame time: {:?}",target_ft);
let mut time_slept = time::Duration::from_micros(0);
let start = time::Instant::now();
loop {
let frame_time = time::Instant::now();
frames+=1;
if frames == 60 {
break
}
if let Some(i) = (target_ft).checked_sub(frame_time.elapsed()) {
time_slept+=i;
thread::sleep(i)
}
}
println!("time elapsed: {:?}",start.elapsed());
println!("time slept: {:?}",time_slept);
}
该函数的想法是以 60fps 的速度执行 60 个循环,然后以经过的时间和循环期间休眠的总时间退出。理想情况下,由于我以 60fps 的速度执行 60 个周期,中间没有真正的计算发生,因此执行大约需要一秒钟,并且基本上整秒钟都在休眠。但相反,当我 运行 它 returns:
target frame time: 16.666ms
time elapsed: 1.8262798s
time slept: 983.2533ms
如您所见,即使仅告知睡眠总共 983 毫秒,60 个周期也需要将近 2 秒才能完成。由于这将近 50% 的不准确性,一个循环告诉 运行 在 60fps 而不是 运行s 在只有 34fps。
文档说 The thread may sleep longer than the duration specified due to scheduling specifics or platform-dependent functionality. It will never sleep less.
但这真的只是来自那个吗?我做错了什么吗?
我从 https://crates.io/crates/spin_sleep 切换到使用 spin_sleep::sleep(i)
,它似乎已经修复了它。我想这一定是 windows 不准确然后...仍然奇怪 time::sleep on windows 对于像游戏循环
这样简单的东西来说还差得远
所以我编写了以下函数来说明我的意思:
use std::{thread, time};
const TARGET_FPS: u64 = 60;
fn main() {
let mut frames = 0;
let target_ft = time::Duration::from_micros(1000000 / TARGET_FPS);
println!("target frame time: {:?}",target_ft);
let mut time_slept = time::Duration::from_micros(0);
let start = time::Instant::now();
loop {
let frame_time = time::Instant::now();
frames+=1;
if frames == 60 {
break
}
if let Some(i) = (target_ft).checked_sub(frame_time.elapsed()) {
time_slept+=i;
thread::sleep(i)
}
}
println!("time elapsed: {:?}",start.elapsed());
println!("time slept: {:?}",time_slept);
}
该函数的想法是以 60fps 的速度执行 60 个循环,然后以经过的时间和循环期间休眠的总时间退出。理想情况下,由于我以 60fps 的速度执行 60 个周期,中间没有真正的计算发生,因此执行大约需要一秒钟,并且基本上整秒钟都在休眠。但相反,当我 运行 它 returns:
target frame time: 16.666ms
time elapsed: 1.8262798s
time slept: 983.2533ms
如您所见,即使仅告知睡眠总共 983 毫秒,60 个周期也需要将近 2 秒才能完成。由于这将近 50% 的不准确性,一个循环告诉 运行 在 60fps 而不是 运行s 在只有 34fps。
文档说 The thread may sleep longer than the duration specified due to scheduling specifics or platform-dependent functionality. It will never sleep less.
但这真的只是来自那个吗?我做错了什么吗?
我从 https://crates.io/crates/spin_sleep 切换到使用 spin_sleep::sleep(i)
,它似乎已经修复了它。我想这一定是 windows 不准确然后...仍然奇怪 time::sleep on windows 对于像游戏循环