增量时间无法与 GLFW 正常工作

Posted

技术标签:

【中文标题】增量时间无法与 GLFW 正常工作【英文标题】:Delta time not working properly with GLFW 【发布时间】:2019-06-04 14:33:41 【问题描述】:

在一个while循环中,我正在调用一个对象的更新函数:

void ParticleEmitter::update(float deltaTime) 
    time += deltaTime;

    if (time >= delay) 
        addParticle();
        time = 0;
    

time 变量默认设置为 0。这基本上是经过的时间。 delay 是 0.01。这意味着每 0.01 秒后,它应该执行if 语句中的任何操作。

这似乎与帧速率无关。但事实并非如此。当我将 FPS 限制为 60 或打开 VSync 时,添加的粒子似乎更少。

增量时间计算正确,我已经测试过了。但我很困惑为什么这段代码不是独立于帧速率的。

【问题讨论】:

要考虑的事项:deltaTime 大于 delay。如果限制帧速率,等待间隔结束所花费的空闲时间是否计入deltaTime 是的,事实上,我所做的任何运动,例如position += velocity * deltaTime,无论帧速率如何,似乎都能给我相同的速度,但是在处理这种东西时,比如添加一次粒子每 0.01 秒,它就会给我带来麻烦。 【参考方案1】:

如 cmets 中所述,您可能没有考虑 deltaTime 中的剩余时间。

例如,假设您有deltaTime = 0.05 或deltaTime = 0.1,因为您只是检查它是否大于或等于然后,每次调用更新时它只会生成一个粒子。因此,如果 deltaTime 更小(帧率更高),那么更新将比 deltaTime 更大时更频繁地调用。

解决方案是应用这样的函数,它根据 timeElapsed 生成许多粒子(从我自己的粒子生成器中提取)

void particleSystem::generateParticles(float timeStep)

    float particlesToCreate = particlesPerSecond * timeStep;
    unsigned int count = static_cast <unsigned int> (particlesToCreate);

    for (unsigned int i = 0; i < count; i++)
    
        emitParticle();
    

particlesPerSecondparticleSystem 中的可配置参数 希望对您有所帮助。

【讨论】:

感谢您的快速回复 :) 这是一个不错的方法。这里的另一个注意事项是,我的帧速率从来都不是固定的,它会不断变化(如果有上限,变化非常小),即使帧速率有上限。 @ReluctantProgrammer 不用担心!如果你想要一个关于粒子的好教程,请在 youtube 上查看 ThinMatrix,他很好地解释了这一点。是的,我以前曾经做过可变时间步长,但我开始使用固定时间步长:D。此答案适用于这两种情况。 是的,我喜欢 ThinMatrix,他解决了我的大部分烦恼。 TheChernoProject 也是如此。无论如何还是非常感谢:D @ReluctantProgrammer 哈哈哈这里也一样。我也会去看看 TheChernoProject。很高兴它有帮助!如果此答案或任何其他答案解决了您的问题,请将其标记为已接受 @ReluctantProgrammer 哈哈哈别担心,我自己也很新。看看这个link【参考方案2】:

它不是独立于帧率的。

为简单起见,我们假设deltaTime 是固定的。

如果是0.1,则每0.1秒添加一个粒子,因为0.1 > 0.01。 如果为 0.01,则每 0.01 秒添加一个粒子。 如果是 1/60(60 FPS),您将每 1/60(~0.01667)秒添加一个粒子,因为 1/60 大于 0.01。 如果是 1/120,你也会每 1/60 秒添加一个粒子,因为 1/120 小于 0.01 而 2 * 1/120 大于 0.01。

如果您希望每次固定数量的粒子,如果增量较大,则需要添加几个。

类似

while (time >= delay)

    addParticle();
    time -= delay;

您也不想将time 设置为 0,而是为下次更新保存“溢出时间”。

这种方法有一个缺点;添加更多粒子需要时间,因此下一次更新可能会更晚。这可能会导致长时间的连锁反应。 如果发生这种情况,您将需要更复杂的方法。

【讨论】:

以上是关于增量时间无法与 GLFW 正常工作的主要内容,如果未能解决你的问题,请参考以下文章

具有更改日志的非重复爬网的自定义 BCS 索引连接器无法正常工作

OpenGL代码适用于GLFW,但不适用于Qt OpenGL

React Native Async\Await 无法与 setState 一起正常工作

地图功能无法与 Dataframe(toDF)一起正常工作 [重复]

Bootstrap 无法与流星一起正常工作

WPF 绑定无法与 int 类型的属性一起正常工作