Зачем использовать интеграцию для игрового цикла с фиксированным временным шагом? (Гаффер об играх)C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Зачем использовать интеграцию для игрового цикла с фиксированным временным шагом? (Гаффер об играх)

Сообщение Anonymous »

http://gafferongames.com/game-physicals ... -timestep/

http://www.koonsolo.com/news/dewitters- gameloop/

В последнем игровом цикле из статьи Гленна Фидлера Fix Your Timestep! он использует цикл обновления, который продвигает логику игры на фиксированная разница времени. Поскольку дельта времени фиксирована, почему он интегрирует на основе дельты времени? В игре с фиксированным временным интервалом движение не может быть таким простым, как:

Код: Выделить всё

if ( keyboard pressing "W" ) {
velocity += acceleration
}
position += velocity
вместо передачи переменной времени:

Код: Выделить всё

if ( keyboard pressing "W" ) {
velocity += integrated(acceleration, delta_time)
}
position += velocity * delta_time
Поскольку дельта времени в цикле с «фиксированным» временным шагом не имеет смысла, это будет похоже на умножение всего на 1. В игре, основанной на «переменном» временном шаге, вам придется используйте дельту времени и интегрируйте движение, но в данном случае это не имеет значения. Обратите внимание, что переменная для дельты времени установлена ​​на константу и никогда не изменяется. Логика игры уже детерминирована, и кажется, что вам не нужно умножать скорость и ускорение на дельту времени где-либо в коде. Что я вынес из статьи, так это «Исправь свой временной шаг!», как следует из названия, чтобы у вас была детерминированная игровая логика вместо неточностей с плавающей запятой и взрывной физики, которая сопровождается переменными временными шагами. Меня просто смутило, почему в функцию обновления передается разница времени, поскольку, похоже, это противоречит цели статьи. Обе статьи фактически выдвигают один и тот же аргумент против разницы во времени.

Код: Выделить всё

double t = 0.0;
double dt = 0.01;

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

State previous;
State current;

while ( !quit )
{
double newTime = time();
double frameTime = newTime - currentTime;
if ( frameTime > 0.25 )
frameTime = 0.25;
currentTime = newTime;

accumulator += frameTime;

while ( accumulator >= dt )
{
previousState = currentState;
integrate( currentState, t, dt ); // integration
t += dt;
accumulator -= dt;
}

const double alpha = accumulator / dt;

State state = currentState * alpha +
previousState * ( 1.0 - alpha );

render( state );
}
Последний игровой цикл deWiTTERS делает то же самое: фиксированный временной шаг, интерполяционный рендеринг, пропуск рендеринга. Однако в нем не упоминается интеграция, как в другом.

Подробнее здесь: https://stackoverflow.com/questions/433 ... r-on-games
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Ошибка: не удалось включить интеграцию цикла событий графического интерфейса для «qt» при импорте панд.
    Anonymous » » в форуме Python
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Можно ли использовать код Python для измерения FPS в определенных играх/окне?
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Обработка ввода Unicode в играх
    Гость » » в форуме C++
    0 Ответы
    20 Просмотры
    Последнее сообщение Гость
  • Как сортировать игроков в головоломках/играх по раундам? с дополнительными ограничениями
    Anonymous » » в форуме Php
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Как заставить моего персонажа прыгать в 2D-играх с Java?
    Anonymous » » в форуме JAVA
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»