Дано:
Windows(т.е. система не реального времени)
Модель колебаний некоторого объекта (Если вместо неё использовать ODE(open dydmic engine) результат точно такой-же)
Модель запускается с некоторым шагом dT
model->Run(dT);
Вариант 0
Если dT=текущее_время-время_предыдущего_шага, то модель уходит в расколбас. (dT плавает в пределах 10%) Вариант 1
Если dT=const то модель ведет себя так как и ожидается, но начинает отставать/обгонять от текущего времени. (Что есть правильно) Вариант 2
Если поступить следующим образом, то на первый взгляд ИМХО все замечательно, и модель запускается с фиксированным шагом,
и отсавание/обгон текущего времени максимум на 0.01
{
const double c_DT=0.01; // фиксированный такт моделирования 10 милисекунд
m_dH+=dT; //
// попытка не дать отстать/обогнать текущее времяif(m_dH>c_DT)
{
while(m_dH>c_DT)
{
m_dH-=c_DT;
// запуск модели с фиксированным шагом моделирования
model->Run(c_DT);
}
}
}
Вопрос:
Хочу использовать вариант 2, но тим-лидер говорит что это не правильно. вот .
Кто прав ?
Что почитать ?
Где искать ?
Куда копать ?
Спасибо.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re: Фиксированный шаг моделирования против плавающего?
Здравствуйте, DoС, Вы писали:
DoС>Вариант 2 DoС>Если поступить следующим образом, то на первый взгляд ИМХО все замечательно, и модель запускается с фиксированным шагом, DoС>и отсавание/обгон текущего времени максимум на 0.01 DoС>
DoС> {
DoС> const double c_DT=0.01; // фиксированный такт моделирования 10 милисекунд
DoС> m_dH+=dT; //
DoС> // попытка не дать отстать/обогнать текущее время
DoС> if(m_dH>c_DT)
DoС> {
DoС> while(m_dH>c_DT)
DoС> {
DoС> m_dH-=c_DT;
DoС> // запуск модели с фиксированным шагом моделирования
DoС> model->Run(c_DT);
DoС> }
DoС> }
DoС> }
DoС>
Поясни, зачем в if вложен while с тем же условием. Или ты там чего-то поскипал?
Re: Фиксированный шаг моделирования против плавающего?
Здравствуйте, DoС, Вы писали:
DoС>Windows(т.е. система не реального времени)
Система не реального времени это круто.
Вот так былобы лучше
Windows(т.е. не система реального времени)
DoС>Хочу использовать вариант 2,
Я бы тоже использовал вариант 2
1)Он предсказуем
2)Если закладываться на константные промежутки времени в некоторых случаях можно упростить реализацию модели.
3)Если DT это константа известная во время компиляции то это развяжет руки оптимизатору. DoС>но тим-лидер говорит что это не правильно. вот .
А как он это аргументирует?
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Фиксированный шаг моделирования против плавающего?
Здравствуйте, Trean, Вы писали:
T>Поясни, зачем в if вложен while с тем же условием. Или ты там чего-то поскипал?
Увидел, посыпал голову пеплом, потом глянул в код, ухх
if нужен чтобы некоторые действия выполнялись только один раз, если модель всетаки отработала
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[2]: Фиксированный шаг моделирования против плавающего?
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, DoС, Вы писали:
DoС>>но тим-лидер говорит что это не правильно. вот . WH>А как он это аргументирует?
{
const double c_DT=0.01; // фиксированный такт моделирования 10 милисекунд
m_dH+=dT; //
// попытка не дать отстать/обогнать текущее времяif(m_dH>c_DT)
{
while(m_dH>c_DT)
{
m_dH-=c_DT;
// запуск модели с фиксированным шагом моделирования
model->Run(c_DT);
}
}
}
Аргументация очень простая:
Если во время работы dT вдруг(по какой либо причине) станит достаточно большим, то получаем два варианта
или: модель с фиксированным шагом полностью доганяет модельное время, и на следующем такте dT будет большим уже по извесной причине и так по нарастающей... в итоге все повиснет
или: если не давать модели с фиксированным тактом выполнятся более чем N раз, то отсавание модели от текущего времени будет больше чем c_DT, и такое отставание может продолжаться неопределенное время
Замечание: судя по тестам, такое может быть очень редко, хотя в критических случаях отставание достигало 10-ти секунд.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[3]: Фиксированный шаг моделирования против плавающего?
Здравствуйте, DoС, Вы писали:
DoС>Аргументация очень простая: DoС>Если во время работы dT вдруг(по какой либо причине) станит достаточно большим, то получаем два варианта DoС>или: модель с фиксированным шагом полностью доганяет модельное время, и на следующем такте dT будет большим уже по извесной причине и так по нарастающей... в итоге все повиснет
Т.е. для просчета с таким мелким c_dT банально не хватает производительности. Я правильно понял?
В общем, тут есть ровно два варианта:
1. Работать с переменным dT. Придется усложнить некоторые алгоритмы. Например, для маленького c_dT не нужно проверять, перескала ли траектория объекта стену в течение шага — достаточно проверить, пересекся ли он со стеной сейчас. Для большого dT так делать нельзя, иначе быстрые объекты будут пролетать сквозь стены.
2. Подбирать c_dT так, чтобы отставания не было. Идея:
{
double c_DT=0.01; // псевдо-фиксированный такт моделирования 10 милисекунд
m_time = current_time(); // берем текущее время
// догоняем его:while(m_time>last_time)
{
last_time += c_DT;
// запуск модели с нашим шагом моделирования
model->Run(c_DT);
}
// замеряем отставание:if (current_time()-last_time > c_DT)
{
// мы отстали больше, чем на один такт модели. Упростим вычисления:
c_DT += 0.001 // тут константа подбора. Можно улушить качество аппроксимации путем более сложной формулы.
}
UI->show(model); // отображаемся
}
DoС>Замечание: судя по тестам, такое может быть очень редко, хотя в критических случаях отставание достигало 10-ти секунд.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.