2015-11-05 28 views
8

La mia app cambia le proprietà di alcune viste veramente semplici (rotazione, traduzione) per fotogramma. Ho usato systrace, come consigliato dagli articoli sulle prestazioni di Android, per verificare se stavo rilasciando i frame.Riduzione delle prestazioni dell'animazione Android quando il dispositivo rimane fermo ma viene toccato

È venuto fuori qualcosa di davvero inaspettato. Quando il dispositivo era fermo (anche se toccavo lo schermo) l'utilizzo della CPU era più alto, gli avvisi su systrace si avvicinavano e la porzione rossa del profiler di rendering GPU era più lunga. Quando ho ruotato o scosso il dispositivo molto velocemente, tutto era OK.

Di seguito sono riportati i collegamenti dei risultati. Shake è quando ho ruotato i dispositivi molto velocemente, no_shake è quando è stato lasciato seduto sulla mia scrivania.

Ho realizzato un'app di prova davvero semplice che utilizza un'unica animazione di traduzione: source code.

Systrace: no shake, shake

utilizzo della CPU: enter image description here

GPU profiler: enter image description here

Guardando lo systrace scossa, in cui il frame-rate è liscia, perché HW_VSYNC_0 e HW_VSYNC_ON_0 linee non hai dati? Come posso leggere la frequenza della CPU (ho abilitato l'opzione durante l'acquisizione della traccia).

Per quanto riguarda il problema, la mia teoria era che il dispositivo potesse abbassare la frequenza della CPU. Come posso leggere questo in systrace? Ho usato un'app di terze parti per verificare questa ipotesi ed è vero come mostrato di seguito. Quindi, cosa posso fare per evitare questo problema?

enter image description here

Perché il dispositivo facendo questo? All'inizio pensavo che il dispositivo utilizzasse i dati dell'accelerometro per capire se non veniva usato e quindi ha ridotto la frequenza della CPU. Ma, per aumentare la frequenza della CPU, devo scuotere il dispositivo molto duramente. Tenendolo come una persona normale non aumenterebbe la frequenza della CPU.

So che ci sono un sacco di domande, ma dopo aver letto tutti gli articoli relativi alla pipeline grafica Android, sono fuori di idee.

Il problema si è verificato su un Sony Xperia Z3 con sistema operativo Android 5.1 il problema non era riproducibile su un Nexus 5 con sistema operativo Android 6.

Aggiornamento

Sembra che il problema di prestazioni è causato dalla CPU/Regolazione della GPU. Lo stesso dispositivo, Xperia Z3, con Android 4.4, anche se riduce la velocità di clock, funziona meglio secondo Systrace. Inoltre, non aumenta la velocità quando si agita.

Per quanto riguarda il gesto di scuotimento necessario per aumentare la velocità della CPU, ho notato che quando provo a ruotare il dispositivo da verticale a orizzontale o viceversa, l'orologio della CPU aumenta in trigger (anche se l'app non cambia orientamento). Quindi, penso che il motivo per cui questo gesto è monitorato sia il è quello di accelerare un possibile cambio di orientamento.

+0

[Snapdragon 810 s * ck male ... ecco perché:)] (http://arstechnica.com/gadgets/2015/ 04/in-depth-with-the-snadragon-810s-heat-problems /) – Selvin

+0

Nexus 5 Snapdragon 800 non presenta questo problema. Non so se questo problema è legato alla versione Android, all'OEM o ad altro .. – Petrakeas

+0

forse è stato riparato ora (nel 6 o nel kernel più recente) ... Continuo a scommettere sul passaggio da "grande" a "piccolo" "core in snapdragon – Selvin

risposta

3

Alcune osservazioni ...

I dispositivi mobili, in particolare quelli a base di chip Qualcomm, riducono in modo aggressivo gli orologi della CPU per ridurre al minimo il consumo di energia. A volte le loro politiche sono un bit heavy-handed. Cercano anche di ridurre il numero di core attivi al numero necessario per gestire il carico di lavoro corrente.

Guardando l'output systrace, proprio sulle linee "CPU n", è possibile vedere che la traccia "shake" mantiene occupati tutti e quattro i core, mentre la traccia "no shake" si sta facendo spesso con 2 o 3 Quindi il carico sul sistema è più leggero quando non lo si agita. A seconda di come è regolato il governor della CPU, potrebbe essere necessario apportare altre modifiche, ad esempio alle frequenze dell'orologio.

È possibile visualizzare le modifiche ai valori dei vari orologi aggiungendo il tag "freq" alla riga di comando systrace. Potrebbe essere necessario un dispositivo rooted per ottenere queste informazioni. Dovrebbe mostrare le modifiche alle impostazioni per gli orologi della CPU, la larghezza di banda della GPU e altri oggetti arcani. Nota che riporta solo modifiche, quindi potresti voler toccare lo schermo dopo che la registrazione ha iniziato a incoraggiarlo a fare qualcosa.

Sono certo che lo sapete, ma per quelli che non lo fanno: se qualcosa richiede N cicli di CPU da eseguire, e la CPU è in esecuzione al 100% della velocità, l'attività verrà completata in T secondi. Se la CPU funziona al 50% della velocità, l'attività verrà completata in 2 * T secondi. Gli strumenti che misurano l'utilizzo della CPU determinano la percentuale del tempo in cui la CPU è in esecuzione o inattiva in un dato periodo. Se lo strumento guarda per 1 secondo e l'attività viene eseguita per 1 secondo, questo è il 100% di utilizzo. Se gli orologi della CPU sono più alti e l'attività termina in 0,5 secondi, questo è il 50% di utilizzo. Il vantaggio dei clock inferiori è che il consumo di energia non è lineare, quindi mentre si utilizzano cicli N CPU in entrambi i casi, la configurazione più bassa e più lenta consuma meno la batteria. Il problema con gli orologi più bassi è che le operazioni richiedono più tempo e la tua app può finire con l'eliminazione dei frame. Questo è il motivo per cui toccare lo schermo solleva gli orologi: il governatore della CPU sa che stai interagendo con il dispositivo e configura il sistema per rendere l'interazione il più agevole possibile.

Si dovrebbe ignorare il materiale VSYNC. Su alcuni dispositivi SurfaceFlinger utilizza segnali VSYNC generati dal software fuori fase ("dispsync" di google per i dettagli). Usa il feedback dal recinto di aggiornamento del display per decidere se è alla deriva, e riaccenderà l'hardware VSYNC per riattivare la sincronizzazione quando necessario. (FWIW, le linee in questione fanno hanno dati nelle tracce che hai postato.)

+0

Grazie per la spiegazione. Ho aggiornato la domanda sul motivo per cui l'aumento della CPU si verifica quando si agita il dispositivo. Per quanto riguarda, Systrace e frequenza della CPU, il tag "freq" è stato abilitato in ADB quando ho catturato le tracce e alcuni dati si mostrano ma quando faccio clic su di essi, non viene mostrato alcun valore. È perché il dispositivo non è radicato? – Petrakeas

+0

Inoltre, ho notato sulla traccia che quando l'hardware VSYNC è attivato, allora VSYNC_app si verifica simultaneamente con HW_VSYNC_0 con offset zero. Ciò significa che ho 2 frame full lag. Se avessi un ritardo di 1.5 frame (come [hai spiegato qui] (http://stackoverflow.com/questions/27947848/understanding-necessity-of-android-vsync-signals), VSYNC_app dovrebbe verificarsi un po 'dopo HW_VSYNC_0. Ho capito bene? – Petrakeas

+0

Non tutti i dispositivi configurano un offset dispsync per l'app. È necessario controllare il boardconfig per il dispositivo in questione. Mi aspetto che gli eventi app e SF vengano compensati da VSYNC sul Nexus 5, ma probabilmente non su Sony. Le righe della CPU nella traccia mostrano più attività nel dispositivo scosso; dovresti scavare per capire cosa sta succedendo. Se non visualizzi i dati nelle righe "freq", nulla cambierà per la durata della traccia (improbabile), o semplicemente non si verifica quando non viene eseguito come root. – fadden

0

Utilizzare l'app per overclock della CPU come SetCPU (è necessario il root) e impostare il governor della CPU su qualcosa che non sia underclock della CPU quando è inattivo, come ad esempio Performance.

Forse potresti semplicemente impostare la frequenza minima della CPU leggermente più alta.

Spero che questo aiuti.

+0

Il mio obiettivo è rendere questo lavoro normale circostanze. Grazie per la risposta però. – Petrakeas