2016-08-10 12 views
1

Это пример (псевдокод) того, как вы можете имитировать и визуализировать видеоигру.Понимание простого моделирования и цикла рендеринга

//simulate 20ms into the future 
const long delta = 20; 
long simulationTime = 0; 
while(true) 
{ 
    while(simulationTime < GetMilliSeconds()) //GetMilliSeconds = Wall Clock Time 
     { 
      //the frame we simulated is still in the past 
      input = GetUserlnput(); 
      UpdateSimulation(delta, input); 
      //we are trying to catch up and eventually pass the wall clock time 
      simulationTime += delta; 
     } 

    //since my current simulation is in the future and 
    //my last simulation is in the past 
    //the current looking of the world has got to be somewhere inbetween 
    RenderGraphics(InterpolateWorldState(GetMilliSeconds() - simulationTime)); 
} 

Вот мой вопрос:

У меня есть 40ms, чтобы пройти через внешние 'а истинный' цикл (означает 25FPS). Метод RenderGraphics занимает 10 мс. Это значит, что у меня есть 30 мс для внутреннего цикла. Метод UpdateSimulation занимает 5 мс. Все остальное можно игнорировать, так как это значение меньше 0,1 мс.

Что такое максимум, я могу установить переменную 'delta' для того, чтобы оставаться в моем графике 40 мс (внешний цикл)? И почему?

ответ

0

Это во многом зависит от того, насколько часто вы хотите и вам нужно обновить свой статус моделирования и пользовательский ввод, учитывая ограничения, упомянутые ниже. Например, если ваша игра содержит внутреннее состояние, основанное на физическом поведении, вам понадобится меньший delta, чтобы обеспечить правильную оценку и отражение движений и коллизий в игровом состоянии. Кроме того, если ваш пользовательский ввод требует мелкомасштабной оценки и обновления состояния, вам также понадобятся меньшие значения delta. Например, съемки с аналоговым пользовательским вводом (например, мышь, джойстик) выиграют от частот обновления более 30 Гц. Если ваша игра не нуждается в такой высокочастотной оценке состояния ввода и игры, то вы можете уйти с большими значениями delta или даже просто обновить состояние игры, как только будут обнаружены какие-либо входные данные игрока.

В вашем конкретном псевдокоде, ваша симуляция будет обновлять в соответствии с фиксированным временным кусочком длиной delta, который требует вашего обновления моделирования для обработки за меньшее время, чем стандартная даты времени, чтобы быть стандартной даты моделируемой. В противном случае время нарастания скорости будет действовать быстрее, чем может быть обновлено время моделирования. Это в конечном счете ограничивает ваш delta в зависимости от того, насколько быстро может быть вычислено время моделирования моделирования delta. Это соотношение также зависит от вашего прецедента и не может быть линейным или постоянным. Например, физические двигатели часто делят ваше время delta, внутренне определяемое скоростью обновления, которую они могут разумно обрабатывать, поскольку более длинные delta раз могут приводить к численным неустойчивостям и сложнее решать линейные системы, увеличивая усилия обработки нелинейно. В других вариантах использования обновление симуляции может занять линейное или даже постоянное время. Тем не менее, многие (возможно, внешние) события могут привести к тому, что ваше обновление моделирования будет обработано слишком медленно, если оно по своей сути требует. Например, загружать ресурсы во время обновлений симуляции, ваша операционная система решает отложить выполнение исполнительного потока, другой процесс, выполняемый пользователем, запуск антивирусного программного обеспечения, низкое давление памяти, медленный процессор и так далее. До сих пор я видел в основном две стратегии, чтобы обойти эту проблему или исправить ее последствия. Во-первых, просто игнорирование может работать, если усилия по обновлению симуляции низки, и предполагается, что причиной замедления является только временное. Это приведет к более или менее заметному «замедленному» поведению вашего моделирования, которое в худшем случае может привести к тому, что время задержки моделирования будет накапливаться навсегда. Вторая стратегия, которую я часто видел, заключалась в том, чтобы просто ограничить измеренное время кадра, которое должно быть смоделировано до некоторой искусственной величины, скажем, 1000 мс. Это приводит к плавному поведению, как только причина замедления исчезает, но имеет тот недостаток, что время ожидания «ограниченного» «потеряно», что может привести к искажениям анимации, если они не обрабатываются или не учитываются. Чтобы выбрать стратегию, анализ вашего случая использования может состоять в измерении времени настенного времени, которое требуется для обработки обновлений моделирования delta и x * delta, и как изменение времени и загрузки моделирования на обработку фактически отражается в времени настенного времени, необходимого для его вычисления, что будет подскажите вам, какое максимальное значение delta предназначено для вашей конкретной аппаратной и программной среды.

 Смежные вопросы

  • Нет связанных вопросов^_^