Фиксированный шаг моделирования против плавающего?
От: DoС  
Дата: 18.05.05 09:15
Оценка:
Бодрого времени суток.

Дано:
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: Фиксированный шаг моделирования против плавающего?
От: Trean Беларусь http://axamit.com/
Дата: 18.05.05 14:32
Оценка: +1
Здравствуйте, 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: Фиксированный шаг моделирования против плавающего?
От: hemmul США  
Дата: 18.05.05 15:19
Оценка: +1
Здравствуйте, DoС, Вы писали:

DoС>Вопрос:

DoС>Хочу использовать вариант 2, но тим-лидер говорит что это не правильно. вот .

э... ммм... хотелось бы выслушать собственно версию тим-лидера

vox clamantis in deserto
Re: Фиксированный шаг моделирования против плавающего?
От: minorlogic Украина  
Дата: 19.05.05 06:14
Оценка:
Фиксированный шаг , плюс интерполяция екстраполяция
Ищу работу, 3D, SLAM, computer graphics/vision.
Re: Фиксированный шаг моделирования против плавающего?
От: WolfHound  
Дата: 19.05.05 07:31
Оценка: +1
Здравствуйте, DoС, Вы писали:

DoС>Windows(т.е. система не реального времени)

Система не реального времени это круто.
Вот так былобы лучше

Windows(т.е. не система реального времени)


DoС>Хочу использовать вариант 2,

Я бы тоже использовал вариант 2
1)Он предсказуем
2)Если закладываться на константные промежутки времени в некоторых случаях можно упростить реализацию модели.
3)Если DT это константа известная во время компиляции то это развяжет руки оптимизатору.
DoС>но тим-лидер говорит что это не правильно. вот .
А как он это аргументирует?
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Фиксированный шаг моделирования против плавающего?
От: DoС  
Дата: 20.05.05 17:46
Оценка:
Здравствуйте, Trean, Вы писали:

T>Поясни, зачем в if вложен while с тем же условием. Или ты там чего-то поскипал?

Увидел, посыпал голову пеплом, потом глянул в код, ухх
if нужен чтобы некоторые действия выполнялись только один раз, если модель всетаки отработала
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[2]: Фиксированный шаг моделирования против плавающего?
От: DoС  
Дата: 20.05.05 17:46
Оценка:
Здравствуйте, 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]: Фиксированный шаг моделирования против плавающего?
От: Sinclair Россия https://github.com/evilguest/
Дата: 23.05.05 05:18
Оценка: +1
Здравствуйте, 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>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.