Веб-приложение Flex: предотвращение падения частоты кадров, когда окно невидимо

Итак, начиная с версии 10.1 во флеш-плеере появилась новая «функция», которая снижает частоту кадров проигрывателя до 2 кадров в секунду, когда окно приложения находится вне поля зрения. Это хорошая новость для производительности, но может нарушить некоторые функции, например класс Timer.

У меня есть приложение, которое использует таймер для отображения обратного отсчета. Учитывая характер приложения, таймеру требуется, чтобы он завершил обратный отсчет, даже если пользователя нет, чтобы его увидеть. Представьте, что вам нужно дать пользователю всего 10 секунд на выполнение задачи. Если пользователь минимизирует окно на полпути через счетчик, он может занять столько времени, сколько захочет, и у него все еще останется 5 секунд, когда он вернется в окно. Очевидно, этого нельзя избежать с новыми флэш-плеерами.

В приложениях Air есть свойство backgroundFrameRate, которое можно установить для предотвращения такого поведения, но оно является частью класса WindowedApplication, поэтому кажется, что оно недоступно в веб-приложении. Кто-нибудь знает способ сохранить постоянную частоту кадров, даже когда окно не видно? Спасибо


person JayPea    schedule 20.11.2011    source источник
comment
+1 за добавление комментария об объекте в приложении AIR. Я не знал, что существует. Я был бы в равной степени удивлен, если бы это можно было сделать в браузере.   -  person JeffryHouser    schedule 26.11.2011
comment
Привет, мистер Джей, вы пробовали возможные исправления?   -  person Drenai    schedule 06.12.2011
comment
Еще нет, извините. Я был очень занят, но опубликую то, что нашел, как только попробую. Я провел несколько быстрых тестов, и мне было трудно воспроизвести задержку, что наводит меня на мысль, что, возможно, я ошибался в отношении падения частоты кадров, влияющего на таймер. В любом случае я попытаюсь проверить это, хотя я не уверен, как измерить частоту кадров при просмотре из окна (в случае, если таймер не влияет). Я думал, что награда будет автоматически назначена за ответ с наивысшим баллом, но если это не так, я могу принять ваш ответ, поскольку вы были первым, кто ответил.   -  person JayPea    schedule 06.12.2011
comment
@JayPea Мы все жаждем очков репутации, но также и знаний :) Из того, что я слышал, падение частоты кадров повлияет на таймер, что может повлиять на некоторые таймеры бездействия, которые мы реализовали в прошлом   -  person Drenai    schedule 07.12.2011


Ответы (3)


Установка для параметра wmode встроенного swf значения непрозрачности предотвратит регулирование частоты кадров.

Брайан

person Drenai    schedule 28.11.2011

Сам не пробовал, но, возможно, вы можете попробовать принудительно установить частоту кадров при отключении:

stage.addEventListener(Event.DEACTIVATE, onDeactivate); 

function onDeactivate (e:Event):void 
{ 
    //eg myFrameRate=24
    stage.frameRate = myFrameRate; 
} 

Сообщите мне, если это сработает.

person AsTheWormTurns    schedule 29.11.2011
comment
Спасибо, у меня не было возможности проверить это, но я награду награду, как только это сделаю. Если оба ответа сработают, я отдам их Брайану, поскольку он ответил первым. - person JayPea; 30.11.2011
comment
@JayPea: нет проблем с наградой ;-) - person AsTheWormTurns; 01.12.2011

Тестирование с помощью:

private var numer:int = 0;
private var prevNumer:int = 0;
private var timer:Timer = new Timer( 1000, 0 )

[...]

var tf:TextField = new TextField ();
addChild (tf);
addEventListener ( Event.ENTER_FRAME, onEnterFrame )
timer.addEventListener (TimerEvent.TIMER, onTimer )
timer.start()
function onTimer ( e:TimerEvent ):void
{ tf.appendText (' ' + (numer - prevNumer)); prevNumer = numer;}
function onEnterFrame ( e:Event ):void { numer++ }

ясно показывает, что когда вы видите вспышку, tf добавляет числа, равные вашему FPS. Если бы таймер менялся вместе с FPS, вы бы не заметили разницы при сворачивании окна. Но, возвращаясь, Вы видите 2 2 2 2 2, то есть FPS упал до 2.

Решение onDeactivate от AsTheWormTurns не работает. Событие запускается, но частота кадров не изменяется. wmode = opaque решение г-на Брайана Бишопа тоже не работает

что-нибудь очевидное: измените функцию onEnterFrame, чтобы установить FPS:

function onEnterFrame ( e:Event ):void { numer++; stage.frameRate = 30 }

Очевидно, вы не можете установить FPS, когда вспышка не видна! Ну, вы не можете установить FPS, если не установите его на 1.

Решение вашей проблемы простое, просто создайте другой таймер, аналогичный приведенному выше, но с дополнительным условием:

function onTimer ( e:TimerEvent ):void {
if ( numer - prevNumer == 2 ) adjustOriginalTimer();
tf.appendText (' ' + (numer - prevNumer)); prevNumer = numer;
}

E: Вы можете прочитать об этом здесь: http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-8000.html

person Markus von Broady    schedule 22.01.2012