9

Qual è il modo migliore per impostare lo sfondo per qualche vista? Ad esempio 2 varianti di backround:Cosa devo usare per una migliore prestazione, nove patch o risorse xml disegnabili?

  1. sfondo con gradiente, angoli e bordo
  2. sfondo con un solo colore arrotondati e gli angoli arrotondati

Quindi quale delle varianti sarebbe meglio, nove patch o risorsa xml estraibile?

+1

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

+0

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

+0

se hai solo bisogno di un colore, imposta lo sfondo con esso. nessuna necessità di risorsa immagine, nessuna necessità di configurazione xml – MengMeng

risposta

14

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

+0

Ottimo lavoro, grazie per la tua risposta. È quasi quello che volevo sentire.Mi hai mostrato un buon esempio per guardare più in profondità nella fonte :) – cooperok

+0

In realtà, sto modificando la risposta in questo momento, risulta che ho trascurato alcune cose, quindi sto rimuovendo alcune delle argomentazioni :) Ma afaik il risultato è il stesso - vinci 'NinePatches'. –

+3

+1. In parole semplici: dati pixel già pronti rispetto a quelli generati proceduralmente con cicli CPU aggiuntivi. Questo è vero anche nella generale grafica per computer. –

Problemi correlati