- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在一个 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 时间),如果它需要有时更多,没关系。所以我的问题如下:
最佳答案
您可以使用 timeBeginPeriod提高定时器/ sleep 的准确性。请注意,这会全局影响系统并可能增加功耗。
您可以在程序开始时调用 timeBeginPeriod(1)
。在您观察到更高计时器准确性的系统上,另一个正在运行的程序可能会做到这一点。
而且我不会费心计算 sleep 时间,只需在循环中使用 sleep(1)
。
但即使只有 16 毫秒的精度,您也可以编写代码,使误差随时间平均。那就是我要做的。编码不难,只需对当前代码进行少量调整即可工作。
或者您可以切换到使移动与耗时成比例的代码。但即使在这种情况下,您也应该实现帧速率限制器,以免获得无用的高帧速率和不必要的功耗。
编辑:根据这个答案中的想法和评论,制定了接受的答案。
关于c# - 高精度 sleep 或如何让出 CPU 并保持精确的帧率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4837416/
感觉我在这里遗漏了一些明显的东西,所以提前道歉。无论如何,这是我尝试转换的一些数据a: acct_num year_prem prem exc 001 20
我正在尝试将表中的模式与用户话语 匹配。 string userUtterance = "I want identification number for number of customers";
当尝试在 Precise 上链接 gccgo 时,出现此链接错误: matt@matt-1005P:~/src/gopath/src/meme$ gccgo cmd/meme/main.go -o m
假设我有以下数据和命令: clc;clear; t = [0:0.1:1]; t_new = [0:0.01:1]; y = [1,2,1,3,2,2,4,5,6,1,0]; p = interp1(
假设我有以下数据和命令: clc;clear; t = [0:0.1:1]; t_new = [0:0.01:1]; y = [1,2,1,3,2,2,4,5,6,1,0]; p = interp1(
我总是想给精确匹配比只匹配前缀的分数更高的分数(例如,“ball”在与“ball*”匹配时应该比“ballistic”得到更高的分数)。 我当前(详细)的方法是在创建 PrefixQuery 时始终执
有什么解决方法可以让我在 Android 中使用 long 或 double 来寻找音频文件中的位置吗?目前 seekTo 只接受 ints 参数。我想更精确(比如在十分之一秒内) int resID
我的 replacingOccurrences 函数有问题。我有一个这样的字符串: let x = "john, johnny, johnney" 我需要做的只是删除“john” 所以我有这段代码:
我正在使用 BeautifulSoup 进行网页抓取。我有这段代码来提取 a 标签的值,但它似乎不起作用。显示错误: AttributeError: 'int' object has no attri
我要在带有标记顶点和标记有向边的图上寻找一种不精确的图匹配算法。我的任务是检测两个图表的变化以将它们显示给开发人员(想想颠覆差异)。我已经实现了基于禁忌搜索 ( this ) 的优化算法,但我无法让该
我有两个网站: example.com 和 yyy.com 他们都有类似的网络应用程序,但在不同的服务器上。我想让 Apache 将所有路径请求重定向到 example.com 与 完全相同的方式yy
因此,我尝试合并两个公司信息数据库(从现在起表 A 和表 B),其中最常见(且可靠)的单一引用点是网站 URL。表 A 已更新,表 B 待更新。 我已经从表 A 中提取了 URL,并使用 PHP 清理
我正在 http://classicorthodoxbible.com/new.html 上制作效果主要描述中的 Angular 色,包裹在自己的跨度中,从他们通常的休息地点移动到随机位置,然后通过指
我目前正在使用我的 Raspberry Pi 及其内置 UART 输入编写 MIDI 合成器。 在某个时间点,为了启用 MIDI 输入的实时回放,我必须设置一种环形缓冲区以与 OpenAL 一起使用,
在 C 中,当设置了一个 float 时, int main(int argc, char *argv[]) { float temp = 98.6f; printf("%f\n",
实现 MP3 无间隙循环的最佳可能性是什么?目前我正在使用 AVAudioPlayer 并将 .numberOfLoops() 属性设置为 -1 但可以听到,轨道重新启动。情况并非如此,例如使用 Tr
我想创建不一定是“正确”矩阵的“类矩阵”对象。但是,确切地说,“类矩阵”是什么意思? 示例 1 > image(1:9) Error in image.default(1:9) : argument
给定一个像这样的 XML 文档: john &title; 我想解析上面的 XML 文档并生成其所有实体已解析的副本。因此,给定上述 XMl 文档,解析器应输出: john
需要说明的是,这种方法不是我要找的: 事实上,此方法会调整 ImageField 的大小。我想将 Image 对象的大小调整为特定且精确的无比例分辨率。有什么办法吗? --编辑-- 对我来说,Ima
我正在尝试使用 TF2.0 eager 模式执行精确的 GP 回归,基于来自 https://colab.research.google.com/github/tensorflow/probabili
我是一名优秀的程序员,十分优秀!