2011-11-20 7 views
5

Quindi c'è una nuova "funzione" nel flash player a partire dalla versione 10.1, che riduce il framerate del giocatore a 2 fps quando la finestra dell'applicazione non è visibile. Questa è una buona notizia per le prestazioni, ma può rompere alcune funzionalità, come la classe Timer.Applicazione web flessibile: impedisce la caduta del framerate quando la finestra è invisibile

Ho un'applicazione che utilizza un timer per visualizzare un conto alla rovescia. Data la natura dell'applicazione, è necessario che il timer completi il ​​conto alla rovescia anche se l'utente non è presente per vederlo. Immagina di dover dare all'utente solo 10 secondi per eseguire un'attività. Se l'utente riduce a icona la finestra a metà del contatore, può impiegare tutto il tempo che desidera e avere ancora 5 secondi quando ritorna alla finestra. Questo a quanto pare non può essere evitato con i nuovi lettori flash.

Nelle applicazioni Air esiste la proprietà backgroundFrameRate che può essere impostata per impedire questo comportamento, ma questo fa parte della classe WindowedApplication, quindi sembra che non sia disponibile in un'applicazione web. Qualcuno sa come mantenere una frequenza fotogrammi costante anche quando la finestra non è visibile? Grazie

+0

+1 per aggiungere il commento sulla proprietà in un'app AIR. Non ero a conoscenza dell'esistenza. Sarei altrettanto sorpreso che ci fosse un modo per farlo in un browser. – JeffryHouser

+0

Ehi, signor Jay, hai provato le possibili correzioni? – Ryan

+0

Non ancora, mi dispiace. Sono stato estremamente impegnato, ma pubblicherò ciò che ho trovato non appena lo proverò.Ho fatto alcuni test rapidi e ho avuto difficoltà a replicare il ritardo, il che mi porta a credere che forse mi sbagliavo sulla caduta del framerate che influenzava il timer. In entrambi i casi proverò a testarlo anche se non sono sicuro di come misurare il framerate con la vista della finestra (nel caso in cui il timer non sia influenzato). Pensavo che la taglia sarebbe stata data automaticamente alla risposta con il punteggio più alto, ma se non è il caso, posso accettare la tua risposta dato che tu eri il primo a rispondere. – JayPea

risposta

1

L'impostazione del parametro wmode dello swf incorporato su opaco impedirà la regolazione del framerate.

Brian

0

non mi ho provato, ma forse si può provare a forzare l'OnDeactivate framerate:

stage.addEventListener(Event.DEACTIVATE, onDeactivate); 

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

fammi sapere se questo funziona.

+0

Grazie, non l'ho ho avuto la possibilità di testare questo, ma premerò il premio non appena lo farò. Se entrambe le risposte funzionano, la darò a Brian da quando ha risposto per primo. – JayPea

+0

@JayPea: nessun problema per la taglia ;-) – AsTheWormTurns

0

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

mostra chiaramente, che quando si vede il flash, tf accoda numero uguale al vostro FPS. Se il timer dovesse essere modificato insieme a FPS, non si vedrebbe alcuna differenza quando si riduce a icona una finestra. Ma, tornando Vedete 2 2 2 2 2, cioè, FPS è sceso a 2.

onDeactivate la soluzione di AsTheWormTurns non funziona. L'evento è stato attivato, ma i fps non sono stati modificati. wmode = soluzione opaca da Brian Bishop non funziona troppo

qualcosa di ovvio da provare: la funzione onEnterFrame cambiamento per impostare FPS:

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

Ovviamente non è possibile impostare FPS quando il flash non è visibile! Beh, non è possibile impostare FPS a meno che non si imposta su 1.

soluzione alternativa al tuo problema è semplice, basta fare un altro timer simile a questo precedente, ma con l'aggiunta di condizionale:

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

E: è possibile leggi qui: http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-8000.html

Problemi correlati