Даже в определениях идиотизма встречается идиотизм.
Цитата:
Идиотизм — устаревшее название идиомы
Идиома в программировании — понятие близкое к понятию шаблона проектирования. Идиомы представляют собой шаблоны проектирования, учитывающие специфику конкретного языка программирования и потому не универсальные. Это хорошие решения проектирования для конкретного языка или программной платформы.
Идиома в программировании — понятие близкое к понятию шаблона проектирования. Идиомы представляют собой шаблоны проектирования, учитывающие специфику конкретного языка программирования и потому не универсальные. Это хорошие решения проектирования для конкретного языка или программной платформы.
Кто не успел - тот опоздал
для понимания материала необходимы следующие знания:
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
Комментарии
![]() ![]() |
|
Спасибо, будем юзать)
|
![]() ![]() |
|
А что будет, если во время игры произойдет синхронизация с тайм-сервером?
|
![]() ![]() |
|
@petyar, видимо конец всему.
|
![]() ![]() |
|
Олежка, время плавает чаще всего под виндами XP с не очень свежей версией FP, например.
|
![]() ![]() |
|
на маке дельта всегда равно 0 - Денис проверял.
на винде баг в те времена проявлялся на core2duo. на линуке не помню. кажись проявлялся. |
![]() ![]() |
|
wvxvw, мы понимаем только то, что нам пишут в справке. все остальные теории о том, что мы "как-то не так" понимаем не верны.
|
![]() ![]() |
|
А на каких версиях ФП это тестилось?
|
![]() ![]() |
|
arkadattx на всех. начиная с 9.0.115
|
![]() ![]() |
|
да не важно совершенно что он считает ) известно, что он должен считать.
|
![]() ![]() |
|
В getTimer() не используется GetProcessTimes(), хоть оно и напрашивается. Вызов getTimer() связан с QueryPerformanceCounter() (возможно и с QueryPerformanceFrequency() и используется какой-то алгоритм обработки данных обоих счетчиков, не проверял, ибо лень). Ну, а тут есть варианты, например: QueryPerformanceCounter - бомба замедленного действия.
У MS всегда были проблемы со временем). Странно, что плеер не использует здесь банальный GetTickCount(). |
![]() ![]() |
|
А существует ли API-метод, возвращающий время, которое в BIOS видно?
|
![]() ![]() |
|
Интересный топик попался на глаза. Безотносительно к флешу, но по сути проблема очень похожая. Это по поводу плавающего времени в виндах и QueryPerformanceCounter() вот люди тоже косяки ловят http://forum.sources.ru/index.php?showtopic=358370
Не ругайтесь за некропостинг). |
![]() ![]() |
|
не будем)
|
![]() ![]() |
|
не надо?
|
Последние записи от 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)