Интервал таймера флеш-игры меняется на половину

#performance #flash #actionscript-3

#Производительность #вспышка #actionscript-3

Вопрос:

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

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

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

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

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

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

ДВОЙНОЕ РЕДАКТИРОВАНИЕ!: Я нашел эту статью: http://www.bit-101.com/blog/?p=910 , и переключил мой код на использование ENTER_FRAME вместо timer , и это работает. Я получаю полные 40 кадров в секунду, плюс-минус несколько %. Все еще не уверен, что не так с таймером; если бы он задерживался на время, проведенное в моем цикле, он бы колебался, но это не так. Это 50 мс каждый раз, независимо от того, сколько времени происходит.

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

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

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

Комментарии:

1. Вы пытались немного увеличить свой таймер. Попробуйте 100 мс, если событие все еще продолжается, и у него есть еще один тик, его следует пропустить.

2. пробовал менять интервал, никакого эффекта, 50 мс каждый раз. Я переключил его на ENTER_FRAME вместо timer, работает отлично. Однако это не отвечает на вопрос.

3. Ответ заключается в том, что ваш код таймера каким-то образом испорчен. Я не могу это исправить, если вы не публикуете код относительно своего таймера. Также какую среду IDE вы используете

4. добавлен некоторый код в сообщении. Я использую Flash Development.

5. Попробуйте переименовать ваш «t» var во что-нибудь другое. Вы должны где-то переопределять атрибут.

Ответ №1:

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

Раньше я думал, что могу использовать SWF FPS 2, установив таймер на 30 кадров в секунду. Что происходило, так это то, что SWF создавал тик, он проверял класс Timer. Таймер может запустить событие. Затем, через полсекунды (SWF был установлен на 2 кадра в секунду), SWF снова будет тикать. Затем класс Timer попытается запустить 15 событий (таймер был установлен на 30 кадров в секунду). Также, по-видимому, существует ограничение на количество событий, которые он может запускать одновременно, поскольку одновременно он может запускать только 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 /

Ответ №2:

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

  • локально вы используете настольный Flash Player, а не плагин / ActiveX
  • swf-файл не находится на той же HTML-странице, онлайн-версия может содержать другие flash-анимации (объявления)
  • на онлайн-HTML-странице для wmode flash устанавливается значение transparent, а на локальной — значение window