#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