9

Каков наилучший способ установить фон для некоторого вида? К примеру 2 варианта фоном:Что я должен использовать для повышения производительности, с девятью патчами или ресурсом xml?

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

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

+1

Я dont't знаю! :) Но так как стандартные темы для Android используют 9patch, я бы предпочел, что делать это не может быть слишком неправильно. – pumpkee

+0

I meen, если мне нужен только один цветной фон, возможно, xml resourse будет быстрее? По крайней мере, файл xml был бы меньшим размером – cooperok

+0

, если вам нужен только один цвет, установите его с ним. не нужен ресурс изображения, не нужно xml config – MengMeng

ответ

14

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

GradientDrawable (один используется для прямоугольников в XML) использует this code для вызова через к Canvas, который в своей очереди, использует нативный вызов, ведущий к SkCanvas, SkDraw и в конечном счете SkScan и SkBlitter.

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

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

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

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

PS да, я знаю, что это не так много прямого ответа

+0

Отличная работа, спасибо за ваш ответ. Это почти то, что я хотел услышать.Вы показали мне хороший пример, чтобы посмотреть глубже в исходный код :) – cooperok

+0

На самом деле, я редактирую ответ прямо сейчас, оказывается, я упустил некоторые вещи, поэтому я удаляю некоторые аргументы :) Но afaik - результат то же - победа 'NinePatches'. –

+3

+1. В простейших словах: готовые пиксельные данные по сравнению с процедурно генерируемыми с дополнительными циклами ЦП. Это верно и для компьютерной графики. –