2016-05-05 27 views
9

Un po 'di contesto primaiOS thread in background rallentare quando interfaccia utente è inattivo

Ho un app Xamarin che essenzialmente flussi video da un server remoto. Ho un thread in background che loop come questo (pseudo-codice):

private void UpdateMethod() 
{ 
    while (running) 
    { 
     bool success = WaitForUpdate(); 

     if (!success) 
     { 
      break; 
     } 

     Update update = GetUpdate(); 
     SendUpdateToConcurentQueue(update); 
    } 

    Disconnect(); 
} 

avvio il thread in background in questo modo:

Thread thread = new Thread(UpdateMethod); 
thread.IsBackground = true; 
thread.Start(); 

La questione

Quando avvio il flusso , tutto è perfetto. È solo dopo ~ 10 secondi di non interazione con il dispositivo che diventa molto lento. Ho emesso il numero di aggiornamenti dal thread in background e sembrano molto più lenti. Di solito ottengo circa 2-6 aggiornamenti da elaborare per aggiornamento (60fps). Quando è super lento, ottengo un ciclo di aggiornamento pari a 6.

Una cosa che mi imbarazza: quando apro il menu della barra superiore di iOS, gli aggiornamenti vengono ripristinati e il flusso torna improvvisamente alla velocità normale. Il rateo di aggiornamento aumenta di ~ 10 secondi e torna ad essere in ritardo come un matto.

Quello che ho provato

ho cercato di iniziare una coda di spedizione solo con questo in esso, come questo:

DispatchQueue queue = new DispatchQueue("updateQueue"); 
queue.DispatchAsync(this.UpdateProcess); 

Non sembrava per aiutare a tutti.

Ho anche provato a cambiare la proprietà QualityOfService nel mio thread di aggiornamento in questo modo:

NSThread.Current.QualityOfService = NSQualityOfService.UserInitiated 

non funziona neanche! Mi sembra che iOS abbia abbassato la priorità del mio thread per qualche ragione. Se inserisco un breakpoint nel mio metodo UpdateMethod, viene colpito quando l'app non è in ritardo. Ma quando c'è ritardo, il punto di interruzione non viene colpito. Ora questo mi imbarazza davvero, dal momento che il codice funziona ancora! Continuo a ricevere gli aggiornamenti, è solo il modo più lento ...

Modifica: Ho provato a utilizzare Strumenti e ho scoperto che la rete viene limitata ... Indagare, ma se qualcuno ha conoscenza di qualsiasi tipo di acceleratore di rete su iOS, fammi sapere.

risposta

4

Provare a impostare IdleTimerDisabled su true, lo facciamo sempre nei giochi iOS per mantenere iOS da inattivo i nostri giochi.

Nota: Lo facciamo in un polite way solo quando l'utente non è a contatto con lo schermo a causa di guardare un replay, livello di modifica segues multimediali, ecc ...

Nota: Assicurarsi che si fa azzerare il folle quando non ne hai bisogno (quando fai l'app in background, ecc ...), Come di uccidere batteria e rendendo gli utenti depressa circa la vostra applicazione per il vero assassino: Apple Store respingimenti

di Apple: App Idle Timer info

Xamarin: UIKit.UIApplication.IdleTimerDisabled Property

Il valore predefinito di questa proprietà è no. Quando la maggior parte delle app non ha tocchi come input dell'utente per un breve periodo, il sistema pone il dispositivo in uno stato di "sospensione" in cui lo schermo si attenua, allo scopo di risparmiare energia, tuttavia le app che non dispongono di input dell'utente tranne che per l'accelerometro-giochi, per esempio-can, impostando questa proprietà su YES, disattivare il “timer di inattività” per scongiurare il sonno sistema

|. IMPORTANTE

È necessario impostare questa proprietà solo se necessario e dovrebbe assicurati di reimpostarlo su NO quando il bisogno non esiste più. La maggior parte delle app dovrebbe lasciare il sistema spento allo scadere del tempo di attesa, incluse le app audio. Con l'uso appropriato di Audio Session Services, la riproduzione e la registrazione procedono ininterrottamente quando lo schermo si spegne. Le uniche app che dovrebbero disabilitare il timer di inattività sono la mappatura di app, giochi o programmi in cui l'app deve continuare a visualizzare il contenuto quando l'interazione dell'utente è minima.

+0

Sono piuttosto sicuro che ho provato anche questo ... Ma io darò un altro tentativo. Sembra che questo sia per l'oscuramento dello schermo, che non sembra accadere solo dopo 10 secondi. –

+0

L'ho appena provato ... ancora in ritardo :( –

+0

Ho modificato la mia domanda: sembra che la rete sia a regime! Molto strano ... –