增量时间无法与 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();
}
}
其中 particlesPerSecond
是 particleSystem
中的可配置参数
希望对你有帮助。
在一个 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();
}
}
其中 particlesPerSecond
是 particleSystem
中的可配置参数
希望对你有帮助。