Delta time не работает должным образом с GLFW - PullRequest
0 голосов
/ 04 июня 2019

В цикле 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 голосов
/ 04 июня 2019

Как уже упоминалось в комментариях, вы, вероятно, не учитываете оставшееся время в 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();
    }
}

С particlesPerSecond является настраиваемым параметром в particleSystem Надеюсь, это поможет.

0 голосов
/ 04 июня 2019

Это не зависит от частоты кадров.

Для простоты предположим, что 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, но сохраняете «время разлива» для следующего обновления.

Тамнедостаток этого подхода;добавление большего количества частиц требует времени, поэтому следующее обновление может появиться позже.Это может вызвать длительный волновой эффект.
Если это произойдет, вам понадобится более сложный подход.

...