gpt4 book ai didi

rust - Rust lang thread::sleep()在Windows上的游戏循环期间休眠几乎是指定时间的两倍

转载 作者:行者123 更新时间:2023-12-03 11:30:49 25 4
gpt4 key购买 nike

因此,我编写了以下函数来说明我的意思:

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个循环,然后随着时间的流逝以及循环中 sleep 所花费的总时间退出。理想情况下,由于我以60帧/秒的速度执行60个周期,并且之间没有进行实际计算,因此执行该程序大约需要花费一秒钟的时间,而基本上整个 sleep 时间都需要花费一秒钟。但是当我运行它时它返回:
target frame time: 16.666ms
time elapsed: 1.8262798s
time slept: 983.2533ms
如您所见,即使只被告知要休眠983毫秒,但60个周期仍需要近2秒钟才能完成。由于存在近50%的误差,因此要求循环以60fps的速度运行,而只能以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错误,然后...仍然很奇怪,那时间::在Windows上 sleep 对于像游戏循环这样简单的事情来说相去甚远

关于rust - Rust lang thread::sleep()在Windows上的游戏循环期间休眠几乎是指定时间的两倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63111126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com