![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Dec 2010
Сообщений: 177
|
Подскажите, как правильно реализовать таймер для обновления физики Box2D, чтобы вызов Step() не завесил от количества fps.
Вероятно, можно использовать флеш класс Timer или же использовать собственный, базирующейся на разнице времени с начала запуска флешки и использующий ф-ю getTime(). Какой же лучше вариант? Если не сложно приведите код самописного таймера, а также интересует с какой частотой для игры стоит вызывать ф-ю update физики на основе таймера? Что касается настроек Step, то они стандартные: m_world.Step(1/30, 10, 10); |
|
|||||
|
дело в том что во флэше нету настоящей многопоточности
если отрисовка потребует больше времени чем один кадр, то это приведёт к задержке вызрва слушателя таймера с другой стороны, нету смысла просчитывать физику чаще чем отрисовка - пользователь не увидит этого точно так нету смысла и отрисовывать чаще чем шаг физики - кадры будут одинаковыми поэтому нету смысла разделять эти таймеры 20-25 кадров в секунду приемлемое значение для анимации Event.ENTER_FRAME хороший способ запускать сперва симуляцию а потом отрисовку
__________________
Хороший отдых - половина работы. |
|
|||||
|
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
artcraft, причем тут вообще многопоточность? Бокс2д считает физику основываясь на времени между шагами, а не покадрово. Высчитав это время можно заставить б2д расчитать положения тел так, как если бы притормаживания не было. Хоть до 5 кадров в секунду все упадет.
Вот так это делал я (код портирован с С++, придумывал не я): private var _previousTime: Number = getTimer(); private var MAXIMUM_NUMBER_OF_STEPS: int = 30; private var FIXED_TIMESTEP: Number = Globals.WORLD_STEP; private var MINIMUM_TIMESTEP: Number = 1 / 300;*/ private function update():void { var frameTime: Number = (getTimer() - _previousTime / 1000); var stepsPerformed: int = 0; while ( (frameTime > 0.0) && (stepsPerformed < MAXIMUM_NUMBER_OF_STEPS) ){ var deltaTime: Number = Math.min( frameTime, FIXED_TIMESTEP ); frameTime -= deltaTime; if (frameTime < MINIMUM_TIMESTEP) { deltaTime += frameTime; frameTime = 0.0; } World.world.Step(deltaTime, 10, 10); stepsPerformed++; } _world.ClearForces(); } |
|
|||||
|
и да, в метод Step каждый раз можно передавать новое значение основанное на текущем фрэймрэйте
Step(1 / realFrameRate, 10, 10); Добавлено через 3 минуты при том что автор поста хочет использовать таймер для вызова метода степ, а я пытаюсь подробно расписать почему в этом нету смысла
__________________
Хороший отдых - половина работы. |
|
|||||
|
Регистрация: Dec 2010
Сообщений: 177
|
Спасибо всем большое, понятно.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 11:11. |
|
|
« Предыдущая тема | Следующая тема » |
|
|