2011-11-20 4 views
5

Así que ha habido una nueva "función" en el reproductor flash desde la versión 10.1, que reduce la velocidad de fotogramas del reproductor a 2 fps cuando la ventana de la aplicación está fuera de la vista. Esta es una buena noticia para el rendimiento, pero puede romper algunas funcionalidades, como la clase Timer.Aplicación web Flex: evitar la caída de framerate cuando la ventana es invisible

Tengo una aplicación que utiliza un temporizador para mostrar una cuenta regresiva. Dada la naturaleza de la aplicación, es necesario que el temporizador complete su cuenta regresiva, incluso si el usuario no está allí para verla. Imagine que necesita darle al usuario solo 10 segundos para realizar una tarea. Si el usuario minimiza la ventana a la mitad del contador, puede tomar todo el tiempo que quiera y aún le quedan 5 segundos cuando regresa a la ventana. Esto aparentemente no se puede evitar con los reproductores flash más nuevos.

En las aplicaciones Air existe la propiedad backgroundFrameRate que se puede establecer para evitar este comportamiento, pero esto es parte de la clase WindowedApplication, por lo que parece que no está disponible en una aplicación web. ¿Alguien sabe una forma de mantener una velocidad de fotogramas constante incluso cuando la ventana no es visible? Gracias

+0

+1 para agregar el comentario sobre la propiedad en una aplicación de AIR. No sabía que existía. También me sorprendería que haya una forma de hacer esto en un navegador. – JeffryHouser

+0

Hola señor Jay, ¿has probado las posibles soluciones? – Ryan

+0

Aún no, lo siento. He estado muy ocupado pero publicaré lo que he encontrado en cuanto lo pruebo.Hice algunas pruebas rápidas y tuve dificultades para replicar el retraso, lo que me lleva a pensar que tal vez estaba equivocado sobre la caída de framerate que afecta al temporizador. De cualquier manera, intentaré probarlo, aunque no estoy seguro de cómo medir la velocidad de fotogramas con la ventana abierta (en caso de que el temporizador no se vea afectado). Pensé que la recompensa se otorgaría automáticamente a la respuesta con el puntaje más alto, pero si no es el caso, puedo aceptar su respuesta ya que usted fue el primero en responder. – JayPea

Respuesta

1

Al establecer el parámetro wmode del swf incrustado en opaco se evitará la aceleración de framerate.

Brian

0

yo no he probado a mí mismo, pero tal vez pueda tratar de forzar la velocidad de fotogramas OnDeactivate:

stage.addEventListener(Event.DEACTIVATE, onDeactivate); 

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

Vamos a saber si esto funciona.

+0

Gracias, no he tuve la oportunidad de probar esto, pero otorgaré la recompensa tan pronto como lo haga. Si ambas respuestas funcionan, se la daré a Brian ya que él respondió primero. – JayPea

+0

@JayPea: no hay problema para la recompensa ;-) – AsTheWormTurns

0

Prueba con:

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++ } 

muestra claramente, que cuando se ve el flash, tf anexa un número igual a su FPS. Si el temporizador cambiara junto con FPS, no verías una diferencia al minimizar una ventana. Pero, volviendo, ve 2 2 2 2 2, es decir, el FPS cayó a 2.

onLa solución activada por AsTheWormTurns no funciona. El evento se dispara, pero el fps no cambia. wmode = solución opaca por el Sr. Brian Bishop no funciona demasiado

algo obvio para tratar: la función onEnterFrame cambio para ajustar FPS:

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

Obviamente No es posible ajustar FPS cuando el flash no es visible! Bueno, no se puede establecer FPS menos que lo establece en 1.

Solución a su problema es sencillo, basta con hacer otro temporizador similar a esto anteriormente, pero con la condición adicional:

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

E: Usted puede Lea sobre esto aquí: http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-8000.html

Cuestiones relacionadas