Правильный метод для интерактивного моделирования (например, вашего) состоит в том, чтобы вызывать функцию рисования как простое действие:
... idle_action(...)
{
redraw();
}
... event_loop(...)
{
while(!quit) {
event e = PeekEvent();
if( e != NO_EVENT ) {
process_event();
} else {
idle_action();
}
}
}
Вместо использования таймеров вы должны измерить время, необходимое для рисования кадра.
Кроме того, ради точности физического моделирования вы также не должны использовать таймер для этого.Вместо этого вы должны перемещать его с меньшими временными шагами постоянной длины, чтобы иметь несколько временных шагов к одному визуализированному кадру.Так, например, для частоты обновления 60 Гц у вас есть интервал кадров ~ 16 мс.Если вы выполняете физическое моделирование с шагом в 1 мс, вы рассчитаете 16 промежуточных шагов.* Обратите внимание, что большинство, если не все пакеты физического моделирования делают это внутренне.Т.е. вы устанавливаете интервал шага, а затем вызываете симуляцию физики только в то время, в которое вы хотите, чтобы она прогрессировала.
На практике это означает, что вы продвинете симуляцию физики к тому времениВы измерили чертеж кадра, чтобы взять.