Использование CGContextDrawTiledImage при разных масштабах приводит к значительному увеличению памяти - PullRequest
3 голосов
/ 17 октября 2010

Я работаю над приложением, в котором есть представление в масштабируемом UIScrollView. Когда пользователь увеличивает или уменьшает масштаб, я перерисовываю представление в UIScrollView, чтобы оно было четким и четким. Это представление имеет фоновое изображение, которое я рисую с помощью CGContextDrawTiledImage.

Я заметил, что использование памяти растет каждый раз, когда я переключаюсь на новый уровень масштабирования. Похоже, CGContextDrawTiledImage хранит кэш где-то изображения, масштабированного до разных размеров. Итак, если я увеличу масштаб с 1,0 до 1,1x, использование памяти возрастет. Возвращение к 1.0 не приводит к росту, но затем к 1.05, а затем к 1.2 - к росту в два раза. Вернуться к 1.1 и без роста. Конечно, уровень масштабирования находится под контролем пользователя, поэтому я не могу контролировать, сколько уровней увеличения происходит. Прямо сейчас мое фоновое изображение довольно большое (512x512), поэтому это приводит к быстрому увеличению использования памяти * . Это не проявляется как утечка памяти в Инструментах, просто дополнительные выделения, которые никогда не освобождаются.

Я пытался найти способ освободить кеш, который создается, но безуспешно. Например, он не отвечает на предупреждения о недостатке памяти.

Я также пытался установить backgroundColor представления в UIColor, созданный с помощью colorWithPatternImage, но это не работает, потому что я выполняю масштабирование, изменяя CTM графического контекста, а не устанавливая преобразование представления.

Какие-нибудь идеи о том, как предотвратить использование памяти от взрыва?

Ответы [ 4 ]

0 голосов
/ 23 декабря 2012

Опираясь на ответ Жака, я обнаружил, что могу очистить кеш, просто сделав копию CGImageRef и выпустив старую.Кэши для других шкал не копируются в новую ссылку.

Я звоню из любого места, меняю масштаб:

 /**
 * Switcheroo to persuade CGImage to drop the many megabytes of cache 
 * it creates when changing scale.
 */
- (void)discardRenderedImageCaches {
    CGImageRef newImageRef = CGImageCreateCopy(renderedImageRef);
    CGImageRef oldImageRef = renderedImageRef;
    renderedImageRef = newImageRef;
    CGImageRelease(oldImageRef);
}
0 голосов
/ 08 января 2011

Как вы загружаете изображение? если вы используете + imageNamed: загруженное изображение постоянно кэшируется iOS, + imageWithContentsOfFile: лучше.

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

Кварц, очевидно, сохраняет какой-то кэш с CGImage каждый раз, когда я рисую его с другим масштабированием в CTM графического контекста. Чтобы обойти это, когда я получаю предупреждение о нехватке памяти, я освобождаю образ и затем в следующий раз лениво повторно инициализирую его. Не идеально, но лучшее, что я смог найти.

Я подал ошибку в Apple, но не получил реального ответа.

0 голосов
/ 17 октября 2010

Вы пытались изменить передаваемый прямоугольник на CGContextDrawTiledImage вместо (или до) изменения CTM контекста?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...