gpt4 book ai didi

animation - glutMainLoop() 与 glutTimerFunc()?

转载 作者:行者123 更新时间:2023-12-01 19:13:32 26 4
gpt4 key购买 nike

我知道 glutMainLoop() 用于一遍又一遍地调用显示,保持恒定的帧速率。同时,如果我也有 glutTimerFunc(),它在最后调用 glutPostRedisplay(),那么它可以保持不同的帧率。

当他们一起工作时,到底会发生什么?计时器功能是否会增加主循环的帧速率并使其更快?或者它是否改变了主循环的默认刷新率?它们如何协同工作?

最佳答案

I know that glutMainLoop() is used to call display over and over again, maintaining a constant frame rate.

不!这不是 glutMainLoop 所做的。 glutMainLoop 的目的是拉取操作系统事件,检查计时器是否已过,查看窗口是否需要重绘,然后调用用户注册的相应回调函数。这发生在循环中,通常该循环是从程序的主入口点开始的,因此名称​​“主循环”

When they are working together, what really happens ? Does the timer function add on to the framerate of main loop and make it faster ? Or does it change the default refresh rate of main loop ? How do they work in conjunction?

如前所述,调度计时器是 glutMainLoop 职责的一部分,因此如果没有它,就不可能有 GLUT 计时器。更重要的是,如果发生没有事件并且没有发布重新显示,并且没有注册idle函数,glutMainLoop将“阻止”程序直到发生一些有趣的事情(即没有消耗 CPU 周期)。

本质上是这样的

void glutMainLoop(void)
{
for(;;){
/* ... */
foreach(t in timers){
if( t.elapsed() ){
t.callback(…);
continue;
}
}
/* ... */
if( display.posted ){
display.callback();
display.posted = false;
continue;
}
idle.callback();
}
}

At the same time, if I also have glutTimerFunc(), which calls glutPostRedisplay() at the end, so it can maintain a different framerate.

GLUT 提供的定时器不保证其精度和抖动。因此,它们并不是特别适合帧速率限制。

通常,帧速率受到垂直同步的限制(或者应该如此),但是垂直同步的阻塞意味着您不能利用这段时间做一些有用的事情,因为进程被阻塞。更好的方法是注册一个空闲函数,在该函数中轮询高分辨率计时器(在 POSIX 兼容系统上 clock_gettime(CLOCK_MONOTONIC, …),在 Windows 上 QueryPerformanceCounter ),并在一个显示刷新间隔减去渲染帧所需的时间后执行glutPostRedisplay

当然,很难准确预测渲染需要多长时间,因此通常的方法是收集滑动窗口平均值和偏差并据此进行调整。您还希望将该计时器与垂直同步对齐。

这当然是一个已解决的问题(至少在电气工程中),可以通过锁相环来解决。本质上你有一个“相位比较器”(即比较你的定时器运行得比你想要同步的东西慢还是快的东西),一个“电荷泵”(你在相位比较器的增量中添加或减去的变量),一个“环路滤波器”(滑动窗口平均值)和一个“振荡器”(定时器),由电荷泵中的环路滤波值控制。

因此,您轮询垂直同步的状态(对于 GLUT 函数来说这是不可能的,甚至对于核心 OpenGL 甚至某些交换控制扩展也是不可能的 - 您必须为此使用操作系统特定的函数)并进行比较与此相比,您的计时器是否落后或运行得快。您将该增量添加到“电荷泵”中,对其进行过滤并将结果反馈到计时器中。这种方法的好处是,它也会自动调整并过滤渲染帧所花费的时间。

关于animation - glutMainLoop() 与 glutTimerFunc()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49446715/

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