На сколько нужно умножать дельту,чтобы получить 50 в секунду
| |
alexsilent | Дата: Пятница, 27 Апреля 2018, 16:17 | Сообщение # 1 |
почти ветеран
Сейчас нет на сайте
| Раньше у меня была такая система отсчета времени:
Код void FixedUpdate() { if (timer > 0) { timer--; } }
// Я всегда знал, что таймер в секунду отмеряет 50 кадров, то есть за секунду будет приблизительно отнято -50 // потому-что FixedUpdate 50 раз в секунду проходит
Но теперь я хочу всюду DeltaTime проставить (чтобы было точнее), и в связи с этим вопрос, На сколько нужно умножать дельту, чтобы получить примерно -50 в секунду?
То есть также, как и в прошлой системе, только связать с дельтой:
timer -= 1f * Time.fixedDeltaTime * ???
(не могу подобрать число, вместо знаков вопроса, у меня то слишком быстро, то слишком медленно время идёт)
PS Просьба не предлагать альтернативный способ типа корутины (мне всё-равно не удобно с этим работать ) да и нужно разобраться, как весь мой код с перемещениями и приращениями правитьДобавлено (27 Апреля 2018, 16:16) --------------------------------------------- Разобрался. Сколько нужно FPS, на столько нужно и поделить, чтоб получить искомую величину. то есть если кадров 30 то 1 / 30 = 0.03333333333 а если мне нужно взять 50 кадров (из FixedTime) то 1 / 50 = 0.02
Вроде правильно, хотя может быть я что-то не учёл. Потому-что не совсем уверен как работает Time.fixedDeltaTime Добавлено (27 Апреля 2018, 16:17) --------------------------------------------- вроде так должно быть
timer -= 1f * Time.fixedDeltaTime * 0.02
Сообщение отредактировал alexsilent - Пятница, 27 Апреля 2018, 15:52 |
|
| |
drcrack | Дата: Пятница, 27 Апреля 2018, 16:18 | Сообщение # 2 |
старожил
Сейчас нет на сайте
| Цитата Но теперь я хочу всюду DeltaTime проставить (чтобы было точнее) Точнее ничего не станет, Time.fixedDeltaTime это фиксированное число которое задается в настройках проекта (по дефолту 0.02), оно НЕ ЯВЛЯЕТСЯ временем с прошлого FixedUpdate и использование его как это делаешь ты бессмысленно. FixedUpdate не для таймеров. Найди программиста в команду, если еще не поздно...
Сообщение отредактировал drcrack - Пятница, 27 Апреля 2018, 16:25 |
|
| |
alexsilent | Дата: Пятница, 27 Апреля 2018, 16:38 | Сообщение # 3 |
почти ветеран
Сейчас нет на сайте
| drcrack, спасибо! Я так программирую уже 15 лет, и сделал несколько коммерческих проектов и на конкурсы несколько раз отправлял мои недоигры) (хотя тот еще г*код у меня, но как-то работает) Хоть я и художник, но мне легче делать самому и спрашивать советы на форумах, если реально путаюсь. А программисты уходят и приходят, особенно когда все мои проекты на голом энтузиазме работают))) Так что стабильнее самому постепенно разобраться во всем, но навсегда, чем искать временного программиста.
Добавлено (27 Апреля 2018, 16:38) --------------------------------------------- Я реально ошибся, и в обратную сторону решил задачу, стали движения еще медленнее) И заодно решил вынести все вычисления из FixedUpdate в Update В общем теперь это более правильнее, как мне кажется:
Код void Update() { if (time > 0) { timer -= 1f * Time.unscaledDeltaTime * 50; } }
PS По крайней мере выглядит, как будто как и было, по скорости (если на глаз прикинуть).
Сообщение отредактировал alexsilent - Пятница, 27 Апреля 2018, 16:45 |
|
| |
drcrack | Дата: Пятница, 27 Апреля 2018, 16:44 | Сообщение # 4 |
старожил
Сейчас нет на сайте
| Цитата В общем теперь это более правильнее, как мне кажется: Ну, по крайней мере теперь это имеет смысл В условии пропустил букву (timer → time) И он изменится от 1.00 до 0.00 примерно за 1/50 секунды, я не уверен что это именно то, что тебе надо
|
|
| |
alexsilent | Дата: Пятница, 27 Апреля 2018, 16:51 | Сообщение # 5 |
почти ветеран
Сейчас нет на сайте
| drcrack, спасибо! Примерно это как раз и нужно) Я может зря избегаю корутины, или другие способы таймеров, надо бы как-нибудь погуглить, как создавать таймеры. Мне главное чтобы минимум ресурсов расходовало. А с корутинами я путаюсь, ибо их если запускаешь, то надо не забыть остановить, а то может и сработать когда объект уничтожен (вроде как) или когда не нужно стало это, короче я с этим запутался и забил, хотя может потом опять вернусь и попробую еще раз осилить эти корутины)
Сообщение отредактировал alexsilent - Пятница, 27 Апреля 2018, 16:52 |
|
| |
Animan2010 | Дата: Пятница, 27 Апреля 2018, 17:38 | Сообщение # 6 |
постоянный участник
Сейчас нет на сайте
| Обычно использую такой способ: Есть некий глобальный DT, равный deltaTime * 60.0f (где 60 это некое ожидаемое число кадров в секунду). То есть если игра притормаживает и работает на 30 фпс, то DT будет равен 2, что означает, что из-за тормозов по времени прошло 2 фрейма вместо 1. Ну и все таймеры соответственно вычитаются как (timer -= DT), а все объекты передвигаются как (x += speed * DT), таким образом даже при низком фпс объекты приближенно будут вести себя как при 60 фпс.
Anima Games Animan Publishing
|
|
| |
Bizzy | Дата: Пятница, 27 Апреля 2018, 17:54 | Сообщение # 7 |
постоянный участник
Сейчас нет на сайте
| alexsilent, Привет. А чем тебе не нравится timer -= Time.deltaTime * 50f; Вот за секунду он и отнимет 50.
|
|
| |
alexsilent | Дата: Пятница, 27 Апреля 2018, 18:11 | Сообщение # 8 |
почти ветеран
Сейчас нет на сайте
| Bizzy, привет! Ну я в принципе вначале не понял, как работает дельта вообще. И пока думал над дельтой в этой теме, какое число присобачить, вдруг вспомнил что читал давно, что ресурсы сильно затрачиваются от умножения. И сейчас думаю что наверное нужно другой способ искать, вместо того чтобы каждый кадр умножать лишний раз. Помню читал: 1) + сложение немного ресурсов тратит 2) - вычитание, больше 3) * умножение ещё больше 4) / и деление больше всех вышеперечисленных способов
Поэтому лишний раз умножать, для проекта где будет много скриптов с таймерами немного проблематично, особенно если это стратегия, или много персонажей на карте. В общем, если я хочу немного оптимизировать эту часть, то наверное надо использовать другие средства, например Time.timeSinceLevelLoad (но я с этим никогда не работал) помозгую потом на досуге
С Time.timeSinceLevelLoad можно будет только один раз запомнить текущее время и потом только сравнивать время, без дополнительных арифметических операций, ну в общем это я только сейчас понял
Добавлено (27 Апреля 2018, 18:09) --------------------------------------------- //Вот так запускать таймер, где вроде как 2 это секунды
Код timer = Time.timeSinceLevelLoad + 2;
// а вот так проверять время и делать что-то после этого
Код if (Time.timeSinceLevelLoad >= timer) { ??? }
Проблема только в том, что у меня таких таймеров нужно исправить где-то штук 200-500 во всём коде проекта)) а это тяжко зато в таком коде будет всего одно вычисление (только при запуске таймера)Добавлено (27 Апреля 2018, 18:11) --------------------------------------------- жаль я поздно додумался до такого)
Сообщение отредактировал alexsilent - Пятница, 27 Апреля 2018, 18:11 |
|
| |
drcrack | Дата: Пятница, 27 Апреля 2018, 19:02 | Сообщение # 9 |
старожил
Сейчас нет на сайте
| Цитата И сейчас думаю что наверное нужно другой способ искать, вместо того чтобы каждый кадр умножать лишний раз. Помню читал: 1) + сложение немного ресурсов тратит 2) - вычитание, больше 3) * умножение ещё больше 4) / и деление больше всех вышеперечисленных способов На современных процах тебе надо сделать минимум миллион операций за кадр, чтобы заметить хоть какое-то отличие между умножением и делением) Не парься по этому поводу) Тем более что условия (if и остальные) тоже не бесплатны и могут замедлить работу намного сильнее чем простое деление (впрочем, не в твоем случае с 500 обьектами — там вообще никакого заметного эффекта не будет)
Сообщение отредактировал drcrack - Пятница, 27 Апреля 2018, 19:51 |
|
| |
alexsilent | Дата: Пятница, 27 Апреля 2018, 19:33 | Сообщение # 10 |
почти ветеран
Сейчас нет на сайте
| Цитата drcrack ( ) Тем более что условия (if и остальные) тоже не бесплатны и могут замедлить работу намного сильнее чем простое деление Мне всегда было интересно, насколько сильно оно жрёт память) Оно конечно не заметно в малых дозах, но я всегда мечтал пилить игры с открытым миром или большим количеством врагов, даже если это не стратегия) надо бы как-нибудь загуглить как оптимально использовать if, и еще другие нюансы
Сообщение отредактировал alexsilent - Пятница, 27 Апреля 2018, 19:33 |
|
| |
Bizzy | Дата: Пятница, 27 Апреля 2018, 19:41 | Сообщение # 11 |
постоянный участник
Сейчас нет на сайте
| alexsilent, Ну если на "Бабине" решил крутить игру, тогда да, это важно. А на любом сегодняшнем агрегате (смартфоны, планшеты, ноутбуки, Пк) ты даже не заметишь нагрузки вычисляя 500 раз сложение. Так что даже не заморачивайся этой мелочью.
Цитата alexsilent ( ) как оптимально использовать if Ни как, только для себя можешь упростить кейсом.
Сообщение отредактировал Bizzy - Пятница, 27 Апреля 2018, 19:43 |
|
| |
drcrack | Дата: Пятница, 27 Апреля 2018, 19:50 | Сообщение # 12 |
старожил
Сейчас нет на сайте
| Цитата надо бы как-нибудь загуглить как оптимально использовать if, и еще другие нюансы в твоем случае — 500 обьектов — тебе вообще об этом думать не надо вот если будет 50000 и начнет тормозить, тогда и начнешь оптимизировать узкие места
|
|
| |
BrightSpot | Дата: Пятница, 27 Апреля 2018, 20:10 | Сообщение # 13 |
заслуженный участник
Сейчас нет на сайте
| Цитата Bizzy ( ) А на любом сегодняшнем агрегате (смартфоны, планшеты, ноутбуки, Пк) ты даже не заметишь нагрузки вычисляя 500 раз сложение. Так что даже не заморачивайся этой мелочью. Я нашел способ! на слабом смартфоне в шейдере вешаешь несколько if, / или sqrt, раскидываешь материал на кучу объектов и смотришь как падает фпс=)) Но все равно в наше время сложно загрузить систему подобным...
Более мощный компьютер глючит быстрее и точнее.
|
|
| |
Ordan | Дата: Суббота, 28 Апреля 2018, 08:29 | Сообщение # 14 |
Главный зомби
Сейчас нет на сайте
| Цитата BrightSpot ( ) Но все равно в наше время сложно загрузить систему подобным... Вот именно, лучше делать не думая об оптимизации. Потом когда игра будет уже играбельной то можно заняться оптимизацией, переосмыслением кода и прочими улучшениями.
Цитата недели: Из-за леса, из-за гор, кишки, месиво, хардкор. (Берсерк ТВ-2)
Мои проекты ТЫК Мои видяхи на ютубэ ТЫК
Если ты споришь с идиотом, вероятно тоже самое делает и он.
|
|
| |
FlyOfFly | Дата: Суббота, 28 Апреля 2018, 12:34 | Сообщение # 15 |
заслуженный участник
Сейчас нет на сайте
| Цитата alexsilent ( ) Но теперь я хочу всюду DeltaTime проставить (чтобы было точнее), и в связи с этим вопрос, На сколько нужно умножать дельту, чтобы получить примерно -50 в секунду?
unscaledDeltaTime это время за сколько выполнился кадр. получается 2*unscaledDeltaTime/50. это означает что 2 набираются за 1/50 секунду
|
|
| |
|