Показать сообщение отдельно
Старый 11.10.2014, 22:13   #509
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 983
Написано 390 полезных сообщений
(для 634 пользователей)
Ответ: [TrueHorror] - разработка

На самом деле Bullet очень устойчивый движок, даже когда я намеренно пытался вывести из равновесия, никаких взрывов сцены или улетающих в небо объектов не было.

В общем что-то похожее как у тебя получилось сделать с функцией btDiscreteDynamicsWorld::stepSimulation.
Там три параметра (два можно оставить по умолчанию).
Первый это дельта-время, то сколько прошло с прошлого вызова (то есть сколько нужно обработать), третий параметр это время минимального шага, а второй это предел количества разрешённых минимальных шагов, в случае если дельта-время будет больше обычного значения.

Например если у игры 60fps можно сделать так:
deltaTime = 1.0f / 60.0f;
stepSimulation( deltaTime, 4, 1.0f / 60.0f );
В данном случае будет один шаг, т. к. он равен дельта-времени.

А вот в случае если по каким-то причинам игра подзастряла на 3 кадра и получилось:
deltaTime = 3.0f * 1.0f / 60.0f;
теперь при вызове
stepSimulation( deltaTime, 4, 1.0f / 60.0f );
будет вызвано три шага.

А вот в случае если игра подзастрянет на 10 кадров, то всё равно больше 4 функция не обработает -- таким образом не произойдет большого неконтролируемого интервала.
Визуально это будет выглядеть как пауза, а не исчезнувший большой кусок времени.

Ну так вот, а если deltaTime будет меньше минимального шага:
deltaTime = 1.0f / 120.0f
stepSimulation( deltaTime, 4, 1.0f / 60.0f );
то начинаются как раз такие глюки с подпрыгиванием.

В общем ставить шаг точно равный fps тоже имхо не надежно, я делаю за кадр 2 шага.
deltaTime ~ 1.0f / 60.0f (то есть может немного гулять).
stepSimulation( deltaTime, 4, 1.0f / 120.0f );
Особых негативных последствий для производительности я не заметил, хотя у меня пока нет таких больших локаций как у тебя и стресс-тестов я не проводил.

Можно вообще отсоединить физику от реального времени:
stepSimulation( 1.0f / 60.0f, 1, 1.0f / 60.0f );
Тогда раз всё ровно, можно попробовать обойтись одним шагом.
Скорость игры будет зависеть от FPS (что тоже не плохо, если графический движок плавно адаптирует сложность графики и FPS не скачет).

Если ты делаешь безлимитный FPS то соответственно шаги придется при необходимости делать ещё меньше, чтобы умещались в deltaTime.

Пока это одна из причин пригания объектов, может есть и другие...
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
mr.DIMAS (11.10.2014)