Что я должен использовать для повышения производительности, девять-патч или катры ресурсов XML?
Как лучше всего установить фон для некоторого представления? Например, 2 варианта backround:
- фон с градиентом, закругленными углами и границей
- фон с одним цветом и закругленными углами
Так какой из вариантов будет лучше, девяти-патч или катры ресурсов XML?
1 ответ:
Я предполагаю, что
NinePatch
будет немного быстрее в большинстве случаев. Вот что я нашел.
GradientDrawable
(тот, который используется для rects в xml) использует этот код для вызова доCanvas
, который в свою очередь использует собственный вызов, ведущий кSkCanvas
,SkDraw
и в конце концов ...SkScan
и ещеSkBlitter
.С другой стороны,
NinePatch
's draw () имеет почти нулевой код Java перед вызовом nativeNinePatch.cpp
который коротко называетNinePatchImpl.cpp
--NinePatch_draw()
--- и в этом вся магия. Код там перебирает отмеченные области и после нескольких последующих вызовов рисует материал, используя примерно ту же логику вSkDraw
(толькоdrawRect()
вместоdrawPath()
), но в конечном итоге это те же самыеSkScan
иSkBlitter
, которые делают работу.Весь этот код довольно трудно мгновенно охватить моей головой, но что бросилось мне в глаза, так это то, что
GradientDrawable
делает два вызова ко всему собственному стеку, если у него есть и фон, и ход (смотрите здесь ), В то время как в любом сценарии ANinePatch
делает только один.Таким образом, без фактического измерения времени для обоих подходов я получаю ощущение, что в большинстве случаев
NinePatch
выигрывает гонку: если мы [ужасно] грубо предполагаем, что собственные стеки вызовов дляdrawRect()
иdrawPath()
используют в значительной степени одну и ту же логику и [Еще одно ужасное упрощение] наборы параметров, которые передаются туда и создаютсяNinePatch
иGradientDrawable
, не влияют на сложность методов так сильно, тоNinePatch
оказывается получается примерно в 2 раза быстрее, чемGradientDrawable
с заполнением и контуром. Ну, при условии, что вы используете обычный 9-секционный 9-патч (т. е. не разрежайте 9-патч на ужасное количество маркеров, что делает итерацию по частям чрезмерно трудоемкой).любой, кто наткнется на это и знает больше об этом предмете (и/или лучше оценивает сложность машинного кода), пожалуйста, поправьте меня, если я ошибаюсь.
PS да, я знаю, что это не очень прямой путь. ответ