Даже в определениях идиотизма встречается идиотизм.
Цитата:
Идиотизм — устаревшее название идиомы
Идиома в программировании — понятие близкое к понятию шаблона проектирования. Идиомы представляют собой шаблоны проектирования, учитывающие специфику конкретного языка программирования и потому не универсальные. Это хорошие решения проектирования для конкретного языка или программной платформы.
Идиома в программировании — понятие близкое к понятию шаблона проектирования. Идиомы представляют собой шаблоны проектирования, учитывающие специфику конкретного языка программирования и потому не универсальные. Это хорошие решения проектирования для конкретного языка или программной платформы.
Кто не успел - тот опоздал
для понимания материала необходимы следующие знания:
getTimer
давно ничего не писал. сейчас буду ругать таймеры.
давным давно, когда мы писали самое настоящее ММО с блэкджеком и перьями, нам приходилось синхронизировать действия на клиенте с действиями на сервере. для этого использовался не хитрый механизм синхронизации при входе в игру.
со временем мы начали получать репорты о том, что у некоторых пользователей после десяти минут в игре действия на экране начинают происходить со значительной задержкой. сперва мы думали, что во всём виноват пинг или лаги сервера, но потом репортов стало чуть больше чем много и мы забеспокоились.
начали тестировать и проблема долго не наблюдалась, пока однажды во время тестов мы не свалили на обед, оставив игру запущенной. вернувшись мы таки увидели задержку на реакцию в ~4 секунды. оставив на ночь мы получили задержку почти в минуту.
разбирая на кусочки всю игру мы поняли, что ошибка спряталась в методе getTimer. тот бесстыдно отставал от реальных часов. характер отставания был не понятен. после ряда наблюдений было установлено, что на разных компах время может как уходить вперёд, так и отставать с течением времени.
с тех пор прошло года три, но проблема всё ещё актуальна.
для решения этого косяка мы начали использовать ( new Date() ).getTime(), придумав свой блэкджек
package by.blooddy.core.utils.time { import flash.utils.getTimer; /** * @author BlooDHounD * @version 1.0 * @playerversion Flash 10 * @langversion 3.0 */ public function getTimer():Number { return flash.utils.getTimer() + deltaTime; } } //====================================================================== // // Inner definitions // //====================================================================== import flash.utils.getTimer; import flash.utils.setInterval; /** * эта величина характеризует на сколько флэшовый таймер сбился * относительно системного времени */ internal var deltaTime:Number = 0; /** * время старта таймера */ internal const startTime:Number = ( new Date() ).getTime() - getTimer(); /** * взводим таймер для периодической синхронизации */ setInterval( function():void { deltaTime = ( new Date() ).getTime() - startTime - getTimer(); }, 10e3 );
Всего комментариев 22
Комментарии
19.04.2011 15:02 | |
Спасибо, будем юзать)
|
19.04.2011 15:48 | |
А что будет, если во время игры произойдет синхронизация с тайм-сервером?
|
19.04.2011 16:14 | |
@petyar, видимо конец всему.
|
19.04.2011 23:35 | |
Олежка, время плавает чаще всего под виндами XP с не очень свежей версией FP, например.
|
20.04.2011 00:48 | |
на маке дельта всегда равно 0 - Денис проверял.
на винде баг в те времена проявлялся на core2duo. на линуке не помню. кажись проявлялся. |
20.04.2011 03:32 | |
wvxvw, мы понимаем только то, что нам пишут в справке. все остальные теории о том, что мы "как-то не так" понимаем не верны.
|
20.04.2011 15:37 | |
А на каких версиях ФП это тестилось?
|
20.04.2011 16:18 | |
arkadattx на всех. начиная с 9.0.115
|
20.04.2011 19:14 | |
да не важно совершенно что он считает ) известно, что он должен считать.
|
21.04.2011 08:54 | |
В getTimer() не используется GetProcessTimes(), хоть оно и напрашивается. Вызов getTimer() связан с QueryPerformanceCounter() (возможно и с QueryPerformanceFrequency() и используется какой-то алгоритм обработки данных обоих счетчиков, не проверял, ибо лень). Ну, а тут есть варианты, например: QueryPerformanceCounter - бомба замедленного действия.
У MS всегда были проблемы со временем). Странно, что плеер не использует здесь банальный GetTickCount(). |
21.04.2011 16:00 | |
А существует ли API-метод, возвращающий время, которое в BIOS видно?
|
07.06.2012 09:34 | |
Интересный топик попался на глаза. Безотносительно к флешу, но по сути проблема очень похожая. Это по поводу плавающего времени в виндах и QueryPerformanceCounter() вот люди тоже косяки ловят http://forum.sources.ru/index.php?showtopic=358370
Не ругайтесь за некропостинг). |
27.07.2012 23:04 | |
не будем)
|
27.07.2012 23:22 | |
не надо?
|
Последние записи от BlooDHounD
- Обновление blooddy_crypto.swc до версии 0.5.1 (31.03.2016)
- Кто не успел - тот опоздал (19.04.2011)
- Обновление blooddy_crypto.swc до версии 0.3.1 (29.11.2010)
- blooddy_crypto.swc теперь умеет JSON (13.10.2010)
- Загадочный CommaExpression (06.09.2010)