La mia ipotesi è, NinePatch
sarebbe leggermente più veloce nella maggior parte dei casi. Ecco cosa ho trovato.
GradientDrawable
(quello utilizzato per rects in XML) utilizza this code chiamare attraverso Canvas
che a sua volta utilizza chiamata nativo conduce a SkCanvas
, SkDraw
ed eventualmente SkScan
e SkBlitter
.
D'altra parte, NinePatch
's draw() has almost zero Java code prima del nativo call to NinePatch.cpp
quale shortly calls NinePatchImpl.cpp
-- NinePatch_draw()
--- ed è lì che la magia è. Il codice viene iterato sopra le regioni contrassegnate e dopo un numero di chiamate successive disegna roba utilizzando la stessa logica in SkDraw
(solo drawRect()
anziché drawPath()
) ma alla fine è lo stesso SkScan
e SkBlitter
che fanno il lavoro.
Tutto quel codice è piuttosto difficile da avvolgere all'istante, ma ciò che ha catturato la mia attenzione è che lo GradientDrawable
effettua due chiamate all'intero stack nativo se ha sia lo sfondo che il tratto (look here), mentre in qualsiasi scenario a NinePatch
ne crea solo uno.
Così, senza in realtà i tempi di misura per entrambi gli approcci Ho la sensazione nella maggior parte dei casi NinePatch
vince la gara: se noi [terribilmente] all'incirca dal presupposto che gli stack di chiamate native per drawRect()
e drawPath()
uso più o meno la stessa logica e [un'altra terribile semplificazione] i set di parametri che vengono passati e creati da NinePatch
e GradientDrawable
non influenzano la complessità dei metodi tanto, quindi NinePatch
risulta essere circa 2 volte più veloce di GradientDrawable
con riempimento e schema. Bene, a patto che tu usi un 9-Patch regolare, in 9 sezioni (cioè non ti spaccare 9-Patch con un sacco di marcatori, rendendo l'iterazione sui pezzi eccessivamente costosa-costosa).
Chiunque inciamperà su questo e ne sa di più sull'argomento (e/o meglio sulla stima della complessità del codice nativo), per favore, correggimi se sbaglio.
PS Sì, lo so questo non è molto più di una risposta diretta
fonte
2013-08-13 09:34:30
I Dont't so! :) Ma dal momento che i temi standard di Android usano 9patch molto, vorrei dire che farlo non può essere troppo sbagliato. – pumpkee
Mi chiedo se ho bisogno solo di uno sfondo a colori, forse la risorsa xml sarebbe più veloce? Almeno il file xml sarebbe di dimensioni più piccole – cooperok
se hai solo bisogno di un colore, imposta lo sfondo con esso. nessuna necessità di risorsa immagine, nessuna necessità di configurazione xml – MengMeng