Delta时间无法与GLFW一起正常使用

时间:2019-06-04 14:33:41

标签: c++ time 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时,似乎添加了更少的粒子。

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

2 个答案:

答案 0 :(得分:0)

它与帧速率无关。

为简单起见,我们假设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,而是保存“溢出时间”以用于下一次更新。

这种方法有一个缺点。添加更多粒子需要时间,因此下一次更新可能会在以后出现。这会导致长时间的涟漪效应。
如果发生这种情况,您将需要一种更复杂的方法。

答案 1 :(得分:0)

如评论中所述,您可能没有考虑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中的可配置参数 希望对您有所帮助。