2016-01-13 27 views
5

Sto analizzando alcuni dei nostri codici su un dispositivo OPO che è normalmente piuttosto veloce e sto vedendo un sacco di stranezze di prestazioni "strane". Prima di approfondire il codice nativo di Android ho pensato di chiedere qui.Perché setColor è così lento su Android

Quello che sto vedendo è che un invito a paint.setColor(argbInt) vogliono circa 5 volte più a lungo rispetto ad eseguire le seguenti chiamate:

paint.setStyle(Paint.Style.FILL); 
paint.setAntiAlias(false); 
canvas.drawRect(x, y, x + w, y + h, paint); 
paint.setAntiAlias(antialias); 

Ora disegnare rect accade sulla GPU quindi immagino non lo faccio vedere eventuali spese generali per questo. Ma perché dovrei ottenere un sovraccarico per il colore della vernice?

E come followup naturale, come posso ridurre detto overhead?

Sto anche vedendo un bel po 'di overhead per canvas.restore() (circa 4 volte più lento del codice sopra) ma immagino che avrebbe senso in quanto potrebbe essere un'operazione complessa. Solo non vedo perché setColor sarebbe lento?

Per la cronaca ho testato le prestazioni su un OPO con System.nanoTime() ed è piuttosto coerente in termini di prestazioni (non un improvviso colpo di GC o qualcosa del genere).

+0

Immagino che setColor attivi alcuni eventi che richiedono tempo. Se sono presenti opere d'arte personalizzate nella vernice e/o nelle sue sottocomponenti, il display dovrebbe essere ricalcolato. Ripeto: immagino, visto che non sono uno sviluppatore Android :) –

+0

Hai provato a creare un'istanza di Colore da applicare? –

+0

perche 'probabilmente in setColor la CPU ruota su tutti i pixel di vernice, mentre gli altri imposta alcune variabili e la GPU fa il resto del lavoro pesante – Gavriel

risposta

0

Impossibile trovare una risposta reale per "perché" ciò accade anche dopo aver scavato attraverso il codice. La mia soluzione era quella di memorizzare nella cache gli oggetti Paint per ogni stile nel nostro tema, quindi ridipingere il componente con impostazioni simili può riutilizzare un valore precedentemente impostato. Questo ha avuto un impatto positivo sulle prestazioni.