Что я должен использовать для повышения производительности, девять-патч или катры ресурсов XML?


Как лучше всего установить фон для некоторого представления? Например, 2 варианта backround:

  1. фон с градиентом, закругленными углами и границей
  2. фон с одним цветом и закругленными углами

Так какой из вариантов будет лучше, девяти-патч или катры ресурсов XML?

1 9

1 ответ:

Я предполагаю, что NinePatch будет немного быстрее в большинстве случаев. Вот что я нашел.

GradientDrawable (тот, который используется для rects в xml) использует этот код для вызова до Canvas, который в свою очередь использует собственный вызов, ведущий к SkCanvas, SkDraw и в конце концов ... SkScan и еще SkBlitter.

С другой стороны, NinePatch's draw () имеет почти нулевой код Java перед вызовом native NinePatch.cpp который коротко называет NinePatchImpl.cpp -- NinePatch_draw() --- и в этом вся магия. Код там перебирает отмеченные области и после нескольких последующих вызовов рисует материал, используя примерно ту же логику в SkDraw (только drawRect() вместо drawPath()), но в конечном итоге это те же самые SkScan и SkBlitter, которые делают работу.

Весь этот код довольно трудно мгновенно охватить моей головой, но что бросилось мне в глаза, так это то, что GradientDrawable делает два вызова ко всему собственному стеку, если у него есть и фон, и ход (смотрите здесь ), В то время как в любом сценарии A NinePatch делает только один.

Таким образом, без фактического измерения времени для обоих подходов я получаю ощущение, что в большинстве случаев NinePatch выигрывает гонку: если мы [ужасно] грубо предполагаем, что собственные стеки вызовов для drawRect() и drawPath() используют в значительной степени одну и ту же логику и [Еще одно ужасное упрощение] наборы параметров, которые передаются туда и создаются NinePatch и GradientDrawable, не влияют на сложность методов так сильно, то NinePatch оказывается получается примерно в 2 раза быстрее, чем GradientDrawable с заполнением и контуром. Ну, при условии, что вы используете обычный 9-секционный 9-патч (т. е. не разрежайте 9-патч на ужасное количество маркеров, что делает итерацию по частям чрезмерно трудоемкой).

любой, кто наткнется на это и знает больше об этом предмете (и/или лучше оценивает сложность машинного кода), пожалуйста, поправьте меня, если я ошибаюсь.

PS да, я знаю, что это не очень прямой путь. ответ