![]() |
Проверка времени
Вечер добрый,
Мне необходимо постоянно получать время на устройстве пользователя, для создания отсчета таймеров. Код AS3:
При создании таймера я сохраню текущее время таким же способом Код AS3:
|
Для чего это нужно оптимизировать? Если тебе нужно только лишь запомнить время создания объекта, вряд ли это будет тонким местом в программе
|
Цитата:
Не может ли постоянное создание нового объекта Date вызвать утечку памяти? Код AS3:
|
если дата нужна только для замера промежутков времени можно попробовать
getTimer правда не уверен что он там внутри не создает ничего. |
Есть функция getTimer() которая возвращает время с момента запуска. Т.е. дату можно запросить один раз при запуске, запомнить значение getTimer() на тот момент и потом прибавлять к сохраненной дате разницу между первым запросом и текущим.
|
Мне нужно время не с момента запуска игры, а глобальное время. 22.12.2016 21:33
Чтобы отмерять в мобильной игрушке когда игрок запустил постройку здания(например), на завершение которого нужно 10 часов. И соответственно отображать разницу. Я просто обнаружил, что текущее время инициализируется лишь создании объекта, а не каждый раз когда я к нему обращуюсь |
создавай new Date раз в секунду(по таймеру) и не парься
|
TEI,
Партизан дело говорит. |
насколько я понял интервал может быть растянут на несколько сессий в этом случае действительно использовать getTimer проблематично.
|
Цитата:
Ничего же не мешает при старте сессии создавать новый Date, а потом опять юзать getTimer() |
Цитата:
Цитата:
|
Еще для проврки времени, нужно по каждому завершению таймера делать синхронизацию времени с сервером. у некоторых игроков за час время клиента расходится с сервером на 5 и больше минут, причина так и не обнаружена
|
Код AS3:
|
Tails, ты не наблюдал рассинхрон времени? использую аналогичный код, и постоянно ловлю репорты что несовпадает с сервом, при пинге меньше секунды
|
faraday
Нет, не наблюдал. Какого рода рассинхрон? Разница постепенно накапливается или фиксированная с самого начала? |
постепенно, когда расхждение больше 10 секунд - синхронизирует с сервом, и через пару минут рассинхрон опять. бывает где-то у 5% игроков, на протяжении всей сессии
|
Цитата:
Хотя, сдается мне, ошибка в коде |
Врядли в таком коде может быть ошибка. расхождения дает как getTimer, так и new Date().getTime(), сетер добавлен как вынужденая мера именно из-за постоянных расхождений, так больше не что не влияет. приходится добавлять время в каждый ответ сервера, и синхронизировать каждый таймер в момент инициализации и завершения. геморой на ровном месте
Код AS3:
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
иногда и вперед уходят, но реже
|
faraday,
Не надо считать время таймером! Так конечно, гарантированно будет расхождение. Изучите листинг приведённого мною класса. Там вообще нет никакого таймера. |
Tails, вариант когда считается в гетере я пробовал тоже. таймер тут служит только для создания события, собственно по этому событию время и сверяется с сервером. так что на момент срабатывания оно равно тому которое в вашем примере.
Все обращения к гетеру в игре, происходят только по событию TICK, так что проблема не в этом |
Вообще не надо считать текущее время и сохранять его в переменную. Считайте текущее время от фиксированной отметки тогда, когда это нужно. Тут как минимум, не учитываются пикосекунды. Ещё расходы на саму операцию сложения и сохранения накладываются и увеличиваются с каждым тиком.
|
я пробовал вариант без сохранения с гетером getTime()+timeDiff, результат тот же. А почему расход увеличивается с каждм тиком, если каждый тик оно так же отсчитывает от getTimer(), и разве точность времени не ограничена тут миллисекундами, почему пико?
Вы пробовали сверять время клиента с сервером, раз в несоклько минут и сохранять результат при дельте? я тоже долгое время не подозревал о существовании проблемы, и у меня всегда все работало и работает норм. |
Есть такая грабля - Когда производишь цикличные вычисление используя в каждом шаге результат предыдущего вычисления - точность неизбежно падает, из-за не идеальности эвм. Это не только в часах, ещё например, с ротацией дисплей объектов бывает такая проблема.
Используйте мой пример. В нём рассинхронизация если и будет, то только из-за реально не корректной работы getTimer(), ну или если клиент находится в гравитационной яме. (Теорию относительности никто не отменял) |
Хм, так а где у меня использование предыдущего результата? берется дельта высчитанная при инициализации, и новое значение getTimer. Я в свое время остановился на том, что проблемма все таки в не идеальности Эвм, в коментах тут разъясняется http://www.flasher.ru/forum/blog.php?b=368
|
Да, не используешь. Мудрёный у тебя код конечно. Из-за реализации через таймер, в любом случае падает точность часов до частоты срабатывания таймера. А срабатывание таймера может снижаться при переходе приложения в неактивное состояние. Это нужно учесть.
Но сам код выглядит рабочим. Если погрешность постоянно растёт без синхронизации, то, скорее всего, бажит getTimer. Вроде wvxvw ещё говорил, что getTimer в некоторых ос может вернуть и того - отрицательное значение! (При определённых обстоятельствах.) |
Цитата:
|
даже если это так, то в момент срабатывания таймера должно быть актулаьное время. надо еще попробовать сверять время с js через externalInterface, не удивлюсь если там будет норм)
|
| Часовой пояс GMT +4, время: 18:53. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.