Внезапный всплеск памяти при использовании UIImage для CGContextSetFillColorWithColor - PullRequest
2 голосов
/ 01 ноября 2011

Я использую изображение для заливки цвета в текущем графическом контексте, используя следующую инструкцию:

CGContextSetFillColorWithColor(aContext,[[UIColor colorWithPatternImage:[UIImage imageNamed:kRunnerGradientedBackgroundImage]] CGColor]);

Этот оператор неожиданно увеличивает использование памяти с 1,3 МБ до 5,6 МБ.Если я освобождаю объект UIImage, он уменьшается до 1,3 МБ, но, поскольку количество сохраненных объектов изображения уже равно 0, я не могу этого сделать.

Есть предложения, как управлять этим внезапным скачком памяти?

Ответы [ 3 ]

1 голос
/ 01 ноября 2011

Насколько велика kRunnerGradientedBackgroundImage и в каком формате? Если PNG, есть ли у него ненужный альфа-канал? Как уже упоминалось в hotpaw2, изображение шаблона должно быть как можно меньшим, и тогда UIKit будет обрабатывать его для вас. Можете ли вы уменьшить размер, используя PNGCRUSH ?

Другой подход заключается в использовании CGGradient или CAGradientLayer для программного создания градиента с помощью CoreGraphics / CoreAnimation.

См:

1 голос
/ 01 ноября 2011

Данные шаблона должны быть загружены в память, чтобы использовать их. Не обойтись. Вы можете попробовать меньший шаблон. Также попробуйте установить цвет заливки для вашего контекста обратно в простой сплошной цвет, когда вы закончите рисовать с рисунком.

ДОБАВЛЕНО: также возможно, что графический контекст сам по себе становится намного больше, когда вы рисуете в нем рисунок или изображение (чтобы сохранить все пиксели, необходимые для изображения с рисунком). Попробуйте удалить и освободить UIView или CGLayer, содержащий графический контекст.

0 голосов
/ 09 ноября 2011

Я удалил изображение и теперь рисую градиент, используя код. Это уменьшило скачок памяти на 4,5 МБ.

...