Интервал таймера флеш игры меняется на половину - PullRequest
0 голосов
/ 17 октября 2011

У нас есть flash-игра, разрабатываемая в ActionScript 3, и она работает намного медленнее на нашем удаленном сервере.

Характеристики игры:

  • 6-8 различных видеоклипов, все 1-кадровые статические файлы png от 10x10 до 100x100
  • от 10 до 60 экземпляров этих MC на экране в любой момент времени
  • Цикл события запускается с таймера флеш-памяти на 25 мс
  • все взаимодействие осуществляется через клавиатуру

Странно то, что мы публикуем файл swf и запускаем его локально, и все быстро. Мы копируем SWF на удаленный сервер, и все работает намного медленнее. Музыка воспроизводится с нормальной скоростью, но все видеоклипы движутся по экрану примерно на половине скорости.

Почему файл будет работать по-другому при получении с удаленного сервера? Разве SWF всегда не запускается локально? Кроме того, мы запустили его локально и удаленно с запущенным диспетчером задач, и он, похоже, не потребляет много ресурсов ЦП или памяти.

РЕДАКТИРОВАТЬ: Хорошо, это действительно странно. Я добавил текстовое поле framecounter в игру. Он сообщает количество мс с момента последнего таймера. Это последовательно сообщает 50 мс. Мой таймер явно установлен на 25. Это объясняет половину скорости, но что объясняет это? Я также добавил проверку свойства timer.Interval, чтобы увидеть, изменилось ли оно и нет; во время игры игра по-прежнему устанавливается на 25.

DOUBLE EDIT !: Я нашел эту статью: http://www.bit -101.com / blog /? P = 910 и переключил свой код на использование ENTER_FRAME вместо таймера, и это работает. Я получаю полные 40 кадров в секунду, даю или беру несколько%. Все еще не уверен, что случилось с таймером, хотя; если бы он задерживался из-за времени, проведенного в моем цикле, он бы колебался, но это не так. Это 50 мс каждый раз, независимо от того, сколько происходит.

Вот код, который я использую (более или менее):

t = new Timer(25);
t.addEventListener(TimerEvent.TIMER, timerTick);
t.start();

и в тиковом коде таймера я использую getTimer () для синхронизации времени между тиками. Каждый раз выходит на 50 мс.

Ответы [ 2 ]

1 голос
/ 22 октября 2011

У меня были некоторые проблемы с классом Timer, когда я использовал его для запуска игрового цикла.Каков fps вашего SWF?Я обнаружил, что 2 из них связаны между собой.

Раньше я думал, что смогу использовать SWF FPS, равный 2, при настройке таймера, чтобы дать мне 30FPS.То, что происходило, было то, что SWF будет кадрировать тик, он будет проверять класс Timer.Таймер может запустить событие.Затем, через полсекунды (SWF был установлен на 2FPS), SWF снова включился.Затем класс Timer попытается запустить 15 событий (для Timer было установлено значение 30FPS).Кажется также, что существует ограничение на количество событий, которые он может запускать одновременно, поскольку он будет запускать только 5 из них за раз.

Переключение на ENTER_FRAME - это также позволяет регулировать частоту кадров, если вынужно.

Также, если вы еще не используете его, научитесь использовать дельта-время для управления движением ваших игровых объектов.

private var m_lastTime:int = 0;

private function _onEnterFrame( e:Event ):void
{
    var currTime:int        = getTimer();
    var deltaTime:Number    = ( currTime - this.m_lastTime ) * 0.001;
    this.m_lastTime         = currTime;

    // then, if you want your object to move at 10 pixels per second, it's:
    myObj.x += 10 * deltaTime;
}

Тогда, независимо от скоростиваш компьютер, ваши объекты будут двигаться с постоянной скоростью.

Если вы делаете физическую игру, вам также нужно подумать об исправлении своего временного шага, чтобы получить более последовательные результаты: http://gafferongames.com/game-physics/fix-your-timestep/

Бонусная ссылка: http://www.8bitrocket.com/2008/04/08/tutorial-creating-an-optimized-as3-game-timer-loop/

1 голос
/ 17 октября 2011

SWF всегда выполняется локально игроком. Возможные различия, которые приходят мне в голову:

  • локально вы используете настольный Flash Player, а не плагин / activeX
  • SWF-файл не находится на той же HTML-странице, онлайн-версия может включать в себя другие flash-анимации (реклама)
  • онлайн-страница html устанавливает прозрачный режим wmode, тогда как локальный устанавливает его в окно
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...