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 对于像游戏循环

这样简单的东西来说还差得远