LINUX.ORG.RU

Fixed timestep

 


0

1

Добрый вечер

У автора одной известной статьи по геймдеву приводится такой код главного цикла игры:

double t = 0.0;
const double dt = 0.01;

double currentTime = hires_time_in_seconds();
double accumulator = 0.0;

while ( !quit )
{
    double newTime = hires_time_in_seconds();
    double frameTime = newTime - currentTime;
    currentTime = newTime; // (1)

    accumulator += frameTime;

    while ( accumulator >= dt )
    {
        integrate( state, t, dt );
        accumulator -= dt;
        t += dt;
    }

    render( state );
}

Мне кажется, или этот код неверен? Разве обновление curent_time не должно происходить внутри цикла в виде

current_time += dt

Я для теста написал такой тест на питоне:

#!/usr/bin/env python3

import time
import random

dt = 0.1

acc = 0.0
current_time = time.time()
start_time = current_time
c = 0

for i in range(1000):
    new_time = time.time()
    frame_time = new_time - current_time
#    current_time = new_time

    acc += frame_time
    while (acc >= dt):
        current_time += dt
        acc -= dt
        print(current_time)

    time.sleep(random.random() * 0.1)

Кусок выхлопа:

1408807032.2563388
1408807032.3563387
1408807032.4563386
1408807032.5563385
1408807032.6563385
1408807032.7563384
1408807032.8563383
1408807032.9563382

Кадры идут строго каждые 0.1 секунд. В той статье ошибка?


В первом.

    double frameTime = newTime - currentTime; // время итерации 
Во втором.

    frame_time = new_time - current_time // время итерации + [0, 0.1)
Kuzy ★★★
()
Ответ на: комментарий от Kuzy

В твоем варианте, его нужно обнулять

Точно, спасибо + я вывожу время кадра, а не игровое время, из-за такого наложения косяков результат оказался правильным. В целом оба варианты эквивалентны.

crowbar
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.