gpt4 book ai didi

opengl - 如何使用 OpenGL/glut 暂停动画

转载 作者:行者123 更新时间:2023-12-01 22:18:36 27 4
gpt4 key购买 nike

为了实现动画,我只是在循环中重新绘制东西。

但是,我需要能够在按下某个键时暂停。我知道我现在做这件事的方式是错误的,因为当循环进行时它会吃掉我所有的循环。

哪种方式更好,并且允许按键暂停和恢复?

我尝试使用 bool 标志,但显然它在循环完成之前不会更改标志。

最佳答案

您已经对正确的非常基本的架构进行了排序,因为所有内容都需要在循环中更新,但是您需要使您的循环对于游戏(或其他需要 OpenGL 动画的应用程序)更加智能。

However, I need to be able to pause when a key is pressed.

执行此操作的基本方法是使用 bool 值 paused 并将游戏包装到一个循环中。

while(!finished) {
while(!paused) {
update();
render();
}
}

通常情况下,您仍然希望在游戏暂停时执行诸如查看库存、制裁剪品等操作,并且许多游戏在游戏暂停时仍在运行其主循环,它们只是不让 Actor 知道任何时间已经过去。例如,听起来您的动画帧只包含多个可见的游戏帧。这是一个坏主意,因为如果动画速度在不同的计算机上增加或减少,动画速度在那些计算机上看起来就会出错。可以考虑我的回答here和链接示例,了解如何通过以毫秒持续时间指定动画帧并在更新循环中传入帧时间来实现独立于帧率的动画。例如,您的主游戏随后变为如下所示:

float previousTime = 0.0f;
float thisTime = 0.0f;
float framePeriod = 0.0f;

while(!finished) {
thisTime = getTimeInMilliseconds();
framePeriod = previousTime - thisTime;

update(framePeriod);
render();

previousTime = thisTime;
}

现在,游戏中所有更新的内容都会知道自上一帧以来已经过去了多少时间。这对您的所有物理计算都有帮助,因为我们所有的物理公式都是基于时间 + 起始因子 + 衰减因子(例如,SUVAT 方程)。相同的信息可用于您的动画,使它们独立于帧率,正如我在一些示例链接中描述的那样 here .

回答问题的下一部分:

it eats all of my cycles when the loop is going on.

这是因为您正在使用 100% 的 CPU 并且永远不会休眠。如果我们考虑在目标设备上想要 30fps(并且我们知道这是可能的),那么我们知道一帧的周期是 1/30 秒。我们刚刚计算了更新和渲染游戏所需的时间,因此我们可以在任何空闲时间 sleep :

float previousTime = 0.0f;
float thisTime = 0.0f;
float framePeriod = 0.0f;
float availablePeriod = 1 / 30.0f;

while (!finished) {
thisTime = getTimeInMilliseconds();
framePeriod = previousTime - thisTime;

update(framePeriod);
render();

previousTime = thisTime;

if (framePeriod < availablePeriod)
sleep(availablePeriod - framePeriod);
}

这种技术称为帧率治理,因为您手动控制渲染和更新的速率。

关于opengl - 如何使用 OpenGL/glut 暂停动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7631457/

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