2013-08-23 11 views
6

Sto cercando di eliminare alcuni hit di prestazioni Main Thread che si verificano quando alloco AVPlayer, AVPlayerItem e AVURLAsset sul thread principale. Qualcuno ha avuto esperienza con lo spostamento/allocazione di questi oggetti su un thread in background? Allo stesso modo, l'elemento corrente di AVPlayer può essere impostato su una coda di sfondo?Creazione e distruzione di classi AVFoundation su code in background?

risposta

-1

In generale, se non è documentato come thread-safe nella documentazione delle classi, non si dovrebbe usare un oggetto di quella classe su più thread.

Più precisamente, mentre c'è un beneficio a fare meno sul thread principale, assegnando AVPlayer, AVPlayerItem e AVURLAsset 's non potrà mai essere praticamente un collo di bottiglia che avete bisogno di preoccuparsi. Invece, dovresti eseguire gli strumenti e trovare problemi di prestazioni reali e concentrarti su quelli.

+2

Sto trovando che questo non è il caso. L'allocazione di un elemento di AVPlayer con un URL tende a rallentare le prestazioni di scorrimento, anche se eseguite su un thread in background. Esattamente perché questo accade non ne sono ancora sicuro. – rob

+0

@rob è corretto. Ottieni un notevole successo nello scorrimento delle prestazioni quando provi a fare tutto questo lavoro. Rob, hai mai fatto progressi su questo problema? – user3344977

+0

@ user3344977 Ho scoperto che potevo mitigare ma non correggere le prestazioni di scorrimento mettendo tutto il possibile sui thread in background. (L'allocazione di AVA da sola richiedeva fino a 30ms sul mio iPhone 6.) Ho anche fatto un test in cui ho usato un video minimo di <1k e caricato sul dispositivo, e questo non ha fatto alcuna differenza - cioè, riducendo la dimensione del file video e il caricamento dal disco non ha migliorato le prestazioni di scorrimento. Sembra che ci sia un inevitabile blocco di ~ 15ms del thread principale quando si avvia un film. Non so ancora cosa sia - il profiling temporale non è stato di grande aiuto. – rob

2

Di seguito vi sicuramente male scorrimento prestazioni

  • Creazione AVPlayer, 10 fps cadere
  • Aggiunta giocatore di AVPlayerLayer, 15 fps cadere
  • gioco Start, 15/25 fps cadere gioco
  • Pausa , 15 fps goccia
  • Dealloca AVPlayer, 20+ fps goccia

Ho provato ad allocare AVPlayer da un thread in background, tuttavia, AVFoundation tornerà al main ed eseguirà l'allocazione/inizializzazione dal main. Lo stesso con play/pause.

Ho avuto qualche successo con la deallocazione di AVPlayer/AVPlayerItem su un thread in background. Fondamentalmente è necessario cancellare l'ultimo riferimento ad AVPlayer dal thread in background.

Problemi correlati