Что я должен использовать для повышения производительности, девять-патч или катры ресурсов 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 да, я знаю, что это не очень прямой путь. ответ