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).
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 :) –
Hai provato a creare un'istanza di Colore da applicare? –
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