|
Болтовня Разговоры на любые темы (думайте, о чем пишите) |
07.12.2013, 23:39
|
#1
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Delta timing
Проблема с дельта таймингом. При скачках в 3-4 миллисекунды заметны рывки при перемещении. Без дельта таймнига все отлично. Есть ли смысл его использовать, если фпс точно меньше 60?
UPD
Рывки оказались из-за округлений Теперь беда в другом.
Допустим герой прыгнул в момент времени, в котором dt(время с предыдущего обновления игры) было 40 миллисекунд. Сила его прыжка увеличилась сильно увеличилась по сравнению с нормой. Затем, dt опять пришло к нормальным 16.6666 миллисекундам. Поэтому коэффицент G, который отвечает за ускорение свободного падения опять нормальный. В результате получаем гигантский прыжок. Как этого избежать?
|
(Offline)
|
|
08.12.2013, 00:43
|
#2
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Delta timing
Если это Unity, то для физики есть FixedUpdate и Time.fixedDeltaTime
Но по сути если провести аналогию с твинингом в блице, то тебе просто надо вызывать логику только допустим 30 раз в секунду и если с предыдущего обновления прошло времени в два раза больше, то выполнить логику два раза.
|
(Offline)
|
|
08.12.2013, 02:33
|
#3
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Delta timing
Оно то хорошо, когда числа ровные. Дробное количество раз не получится же логику выполнить. Мне поэтому и интересно, уместно ли это для фпс ниже стандартного. Понятное дело, что это необходимо для ребят с крутыми конфигами, чтобы они по карте не гоняли как сверхскоростные болиды.
|
(Offline)
|
|
08.12.2013, 11:05
|
#4
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Delta timing
Да в чем проблема я не понимаю?
float ellipsedTime = 0; public float timeStep = 1000f / 60f;
void Update() { ellipsedTime += Time.deltaTime * 1000f;
while(ellipsedTime >= timeStep) { ellipsedTime -= timeStep; UpdateLogic(); } }
void UpdateLogic() { // обновление логики с фиксированным шагом времени в timeStep мс
}
|
(Offline)
|
|
08.12.2013, 11:48
|
#5
|
Принтер
Регистрация: 21.04.2013
Адрес: Больше не РФ
Сообщений: 570
Написано 342 полезных сообщений (для 1,242 пользователей)
|
Ответ: Delta timing
Что эта тема делает в болтовне?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
08.12.2013, 13:52
|
#6
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Delta timing
В данном способе 2 проблемы.
Если таки у игрока больше 60 фпс - цикл вообще не запустится.
Если у игрока 29 фпс, разницы с 30 фпс почти не должно быть, однако update() будет выполнено 3 раза, в то время как при 30 фпс - 2 раза.
|
(Offline)
|
|
08.12.2013, 16:30
|
#7
|
Мастер
Регистрация: 12.01.2009
Сообщений: 980
Написано 389 полезных сообщений (для 632 пользователей)
|
Ответ: Delta timing
Если апдейт логики можно сделать только с фиксированным шагом, то лучше действительно сделать жесткую привязку к fps и ограничить его.
|
(Offline)
|
|
08.12.2013, 16:34
|
#8
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Delta timing
Сообщение от Nikich
В данном способе 2 проблемы.
Если таки у игрока больше 60 фпс - цикл вообще не запустится.
Если у игрока 29 фпс, разницы с 30 фпс почти не должно быть, однако update() будет выполнено 3 раза, в то время как при 30 фпс - 2 раза.
|
Ты верно код читал не внимательно или его не попробовал.
|
(Offline)
|
|
08.12.2013, 19:10
|
#9
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Delta timing
Исходя из первого поста, почему сила прыжка зависит от dt? Она не должна, при прыжке персонаж получит ускорение в 100 единиц. Далее при применении ускорения - применяешь dt.
|
(Offline)
|
|
08.12.2013, 22:20
|
#10
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Delta timing
moka
Сейчас так и делаю. Но баланса все равно нету: игрок с маленьким фпс не может прыгнуть так же высоко, как игрок с нормальным.
PAX
public float timeStep = 1000f / 60f;
Известные 16(6) мс.
ellipsedTime += Time.deltaTime * 1000f;
Допустим у пользователя супер мощный конфиг, и у него игра идет со 120 ФПС, то бишь 8(3) мс.
while(ellipsedTime >= timeStep)
Никогда не произойдет, так как 8(3) точно меньше чем 16(6).
|
(Offline)
|
|
08.12.2013, 23:06
|
#11
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Delta timing
А теперь посмотри на эту строку внимательно:
ellipsedTime += Time.deltaTime * 1000f;
Время накапливается (оператор += тебе ничего не сказал?), за два отрисованных кадра будет 2 * 8(3) и сработает логика. Я ж говорю, невнимательно код смотрел и не пробовал.
В твоем примере 29 FPS будет 30 раз срабатывать логика, она даже с 15 FPS будет 30 раз срабатывать. И даже имея 128 FPS с шагом в 1000f / 60f логика будет срабатывать 60 раз в секунду в среднем.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
11.12.2013, 02:06
|
#12
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Delta timing
При уменьшении фпс, увеличивается количество вызова логики, что будет уменьшать фпс. Получаем рекурсивный проигрыш производительности.
|
(Offline)
|
|
11.12.2013, 07:05
|
#13
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Delta timing
Не хочешь признать, что был не прав. Ладно.
Сообщение от Nikich
При уменьшении фпс, увеличивается количество вызова логики, что будет уменьшать фпс. Получаем рекурсивный проигрыш производительности.
|
Что такое рекурсивный проигрыш производительности? Ты хочешь замедлять игры при FPS меньше нормы или чтобы игра работала нормально? Твоя логика (за 30 FPS) работает столько же или больше, сколько и вывод одного кадра на экран?
Последний раз редактировалось pax, 11.12.2013 в 09:16.
|
(Offline)
|
|
11.12.2013, 16:15
|
#14
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Delta timing
Я был не прав, да, не заметил "+=". И не спорю, что при слабой логике это было бы отличным решением.
Но решение с обычным домножением скоростей на deltaTime кажется более верным и логичным, разве нет?
|
(Offline)
|
|
11.12.2013, 19:42
|
#15
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Delta timing
Если физика зависит от времени, то нет. Логичнее использовать фиксированный шаг времени. Если физика рассчитывается на больших интервалах времени, то меньше точность.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:35.
|