9

Jaki jest najlepszy sposób ustawienia tła dla niektórych widoków? Na przykład 2 warianty backround:Co powinienem użyć, aby uzyskać lepszą wydajność, dziewięcioszynkowe lub szufladowe zasoby xml?

  1. tle z gradientu, zaokrąglone narożniki i granice
  2. tło z jednym kolorze i zaokrąglone narożniki

Więc który z wariantów byłoby lepiej, dziewięć-łata lub drawable xml resource?

+1

I dont't wiedzieć! :) Ale skoro standardowe motywy z Androidem używają 9patchów, to przypuszczam, że tak nie może być zbyt źle. – pumpkee

+0

I meen, jeśli potrzebuję tylko jednego koloru tła, może xml resourse będzie szybciej? Przynajmniej plik xml będzie mniejszy niż rozmiar – cooperok

+0

, jeśli potrzebujesz tylko jednego koloru, ustaw dla niego tło. nie potrzebujesz zasobów graficznych, nie ma potrzeby konfiguracji xml – MengMeng

Odpowiedz

14

Domyślam się, że w większości przypadków NinePatch byłaby nieco szybsza. Oto co znalazłem.

GradientDrawable (jeden służy do prostokąty, XML) wykorzystuje this code wywołać aż do Canvas który z kolei wykorzystuje naturalną połączenia prowadzące do SkCanvas, SkDraw i ewentualnie SkScan i SkBlitter.

Z drugiej strony, NinePatch's draw() has almost zero Java code przed rodzimym call to NinePatch.cpp, który shortly calls NinePatchImpl.cpp -- NinePatch_draw() --- i tam właśnie jest magia. Kod tam jest iterowany nad zaznaczonymi regionami i po wielu kolejnych wywołaniach rysuje rzeczy używając mniej więcej tej samej logiki w SkDraw (tylko drawRect() zamiast drawPath()), ale w końcu to samo SkScan i SkBlitter, które wykonują pracę.

Cały ten kod jest dość trudny do natychmiastowego objęcia głowy, ale co przykuło moją uwagę to, że GradientDrawable wykonuje dwa połączenia do całego rodzimego stosu, jeśli ma zarówno tło, jak i obrys (look here), podczas gdy w dowolnym scenariuszu NinePatch tylko jeden.

Tak, bez faktycznego czasu pomiaru dla obu podejść mam uczucie w większości przypadków NinePatch wygrywa wyścig: jeśli [strasznie] grubsza przyjąć, że rodzime stosy połączeń dla drawRect() i drawPath() użytku praktycznie taka sama logika i [inne straszne uproszczenie] zestawy parametrów, które są przekazywane tam i są tworzone przez NinePatch i GradientDrawable, nie wpływają na złożoność metod, a następnie NinePatch okazuje się być około 2 razy szybsze niż GradientDrawable z wypełnieniem i konturem. Cóż, pod warunkiem, że użyjesz zwykłej 9-plasterkowej 9-plasterkowej łatki (to znaczy nie zrujnujesz dziewięciu łatek przez strasznie dużo znaczników, sprawiając, że iteracja po kawałkach będzie zbyt kosztowna).

Każdy, kto się na to natknie i wie więcej na ten temat (i/lub lepiej ocenia złożoność kodu natywnego), proszę, popraw mnie, jeśli się mylę.

PS Tak, wiem, że to nie jest zbyt prostą odpowiedź

+0

Świetna robota, dziękuję za odpowiedź. To prawie to, co chciałem usłyszeć.Pokazałeś mi dobry przykład, aby zagłębić się w źródło :) – cooperok

+0

Właściwie to teraz edytuję odpowiedź, okazuje się, że przeoczyłem pewne rzeczy, więc usunęło trochę argumentacji :) Ale afaik wynik jest same - wygrana "NinePatches". –

+3

+1. Najprościej mówiąc: gotowe dane pikselowe w porównaniu do wygenerowanych proceduralnie z dodatkowymi cyklami procesora. Dotyczy to również ogólnej grafiki komputerowej. –

Powiązane problemy