Советы по сокращению использования памяти Core Animation - PullRequest
3 голосов
/ 11 февраля 2009

Итак, вот ситуация:

У меня есть CALayer размером с мой экран, и я устанавливаю свойство содержимого в формате JPEG размером 2 МБ, размером примерно 3500 x 2000 пикселей, с разрешением 240 пикселей на дюйм.

Я бы ожидал, что использование CALayer будет связано с небольшими затратами, но в моем примере приложения (которое выполняет только то, что описано выше) показано использование около 33 МБ RSIZE, 22 МБ RPVT и 30 МБ RSHRD. Я заметил, что эти числа намного лучше, когда приложение работает как 64-битное, чем 32-битное.

Я делаю все, что могу придумать в реальном приложении, из которого получен этот пример, включая пересчет моих CGImageRefs, чтобы они соответствовали только размеру слоя, но мне это кажется посторонним - разве это не должно быть проще?

Кто-нибудь сталкивался с хорошими методами для уменьшения количества памяти, используемой CALayers и CGImageRefs?

1 Ответ

4 голосов
/ 11 февраля 2009

Во-первых, у вас возникнут проблемы с изображением такого размера в обычном CALayer, поскольку вы можете достичь предела размера текстуры 2048 x 2048 (в зависимости от вашей видеокарты). Такие приложения предназначены для CATiledLayer. У Билла Дадни есть несколько примеров кода в его блоге (большой PDF), а также код, который сопровождает его книгу .

Меня не удивляет, что такое большое изображение заняло бы столько памяти, учитывая, что оно будет храниться в виде несжатого растрового изображения в вашем CGImage. Помимо масштабирования изображения до необходимого разрешения и добавления его к CATiledLayer, я не могу думать о многом. Выпускаете ли вы CGImageRef после того, как вы присвоили его содержимому CAlayer? Вам не нужно будет висеть на этом месте.

...