gpt4 book ai didi

c# - 高精度 sleep 或如何让出 CPU 并保持精确的帧率

转载 作者:太空狗 更新时间:2023-10-29 23:03:26 37 4
gpt4 key购买 nike

我在一个 2D 游戏引擎上工作,它有一个名为 LimitFrameRate 的函数来确保游戏不会运行得太快以至于用户无法玩游戏。在这个游戏引擎中,游戏的速度与帧率有关。所以通常人们希望将帧速率限制在 60 fps 左右。这个函数的代码相对简单:计算我们应该开始处理下一帧之前的剩余时间量,将其转换为毫秒,休眠该毫秒数(可能为 0),重复直到恰到好处的时间,然后退出。这是代码:

public virtual void LimitFrameRate(int fps)
{
long freq;
long frame;
freq = System.Diagnostics.Stopwatch.Frequency;
frame = System.Diagnostics.Stopwatch.GetTimestamp();
while ((frame - previousFrame) * fps < freq)
{
int sleepTime = (int)((previousFrame * fps + freq - frame * fps) * 1000 / (freq * fps));
System.Threading.Thread.Sleep(sleepTime);
frame = System.Diagnostics.Stopwatch.GetTimestamp();
}
previousFrame = frame;
}

当然,我发现由于某些系统上 sleep 功能的不精确性,帧速率与预期完全不同。 sleep 功能的精度只有 15 毫秒左右,所以您不能再等了。奇怪的是,有些系统用这段代码达到了完美的帧率,并且可以完美地达到一定范围内的帧率。但其他系统没有。我可以删除 sleep 功能,然后其他系统将达到帧率,但它们会占用 CPU。

我看过其他关于 sleep 功能的文章:

程序员要做什么?我不是要求保证帧速率(或保证 sleep 时间,换句话说),只是一般行为。我希望能够休眠(例如)7 毫秒,以便将一些 CPU 交给操作系统,并让它通常在 7 毫秒或更短的时间内返回控制权(只要它能收回一些 CPU 时间),如果它需要有时更多,没关系。所以我的问题如下:

  1. 为什么 sleep 在某些 Windows 环境中完美而准确地工作,而在其他环境中却不行? (有没有办法在所有环境中获得相同的行为?)
  2. 如何在不占用 C# 代码的 CPU 的情况下实现通常精确的帧速率?

最佳答案

您可以使用 timeBeginPeriod提高定时器/ sleep 的准确性。请注意,这会全局影响系统并可能增加功耗。
您可以在程序开始时调用 timeBeginPeriod(1)。在您观察到更高计时器准确性的系统上,另一个正在运行的程序可能会做到这一点。
而且我不会费心计算 sleep 时间,只需在循环中使用 sleep(1)

但即使只有 16 毫秒的精度,您也可以编写代码,使误差随时间平均。那就是我要做的。编码不难,只需对当前代码进行少量调整即可工作。

或者您可以切换到使移动与耗时成比例的代码。但即使在这种情况下,您也应该实现帧速率限制器,以免获得无用的高帧速率和不必要的功耗。

编辑:根据这个答案中的想法和评论,制定了接受的答案。

关于c# - 高精度 sleep 或如何让出 CPU 并保持精确的帧率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4837416/

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