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

Delta time not working properly with GLFW

在一个 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 时,添加的粒子似乎变少了。

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

不是framerate-independent。

为简单起见,我们假设 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。

如果你想要每次固定数量的粒子,如果delta很大,你需要添加几个。

类似

while (time >= delay)
{
    addParticle();
    time -= delay;
}

您也不想将 time 设置为 0,但保存 "spill time" 以供下次更新。

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

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

例如,假设您有 deltaTime = 0.05 或 deltaTime = 0.1,因为您只是检查它是否大于或等于,每次更新时它只会生成一个粒子叫。因此,如果 deltaTime 更小(帧率更高),那么 update 将比 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 中的可配置参数 希望对你有帮助。