Пятница, 15 Ноября 2024, 01:03

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
На сколько нужно умножать дельту,чтобы получить 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 секунду
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг