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

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

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

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

Ответы [ 3 ]

1 голос
/ 28 ноября 2011

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

Brian

0 голосов
/ 23 января 2012

Тестирование с:

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 не работает. Событие запускается, но fps не изменяется. wmode = непрозрачное решение мистера Брайана Бишопа тоже не работает

что-то очевидное, чтобы попробовать: измените функцию 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

0 голосов
/ 29 ноября 2011

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

stage.addEventListener(Event.DEACTIVATE, onDeactivate); 

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

Дайте мне знать, если это работает.

...