У меня странная проблема с CoreGraphics
/ CoreAnimation
на iPhone.Чтобы лучше объяснить, как проявляется проблема, я проведу вас через мои текущие настройки и проиллюстрирую, где это уместно, кодом.
Я пытаюсь нарисовать кучу предварительно загруженных изображений в UIView
's CALayer
, но всякий раз, когда изображение отображается, пики в памяти приложения возрастают, а память не восстанавливается при каждом изменении изображения.
Предварительная загрузка изображений выполняется путем чтения их с помощью средств UIImage
и их рендеринга.на растровый контекст и извлечение CGImageRef
из этого контекста.Цель этого состоит в том, чтобы распаковать и масштабировать изображения, чтобы эти операции не выполнялись при каждом рисовании.Аналогичная рекомендация может быть найдена в вопросах и ответах Apple по этому вопросу (ищите производительность CGContextDrawImage
, если вам интересно).Контекст устанавливается с 8 битами на компонент и предварительно умноженным альфа.
После того, как изображения распакованы в растровое изображение, они сохраняются в NSArray
и позже назначаются (не сохраняются) для пользовательского UIView
подкласс, который делает рисунок.Я пробовал разные подходы к рисованию изображений, и самым быстрым способом на данный момент является непосредственная установка свойства вида CALayer
contents
.Другие методы, такие как drawLayer:inContext:
и drawRect:
, оказывают различное влияние на частоту кадров, но все они демонстрируют одинаковое поведение памяти.
Проблема заключается в том, что ... после изменения свойства contents
я вижу всплескв памяти инструментов, и эта память не уменьшается даже после того, как изображение больше не отображается.Распределение объектов остается постоянным, поэтому я предполагаю, что CoreAnimation
создает неявный кэш для ускорения рисования.Однако, как я уже сказал, этот кэш не освобождается, когда это необходимо, и постепенное наращивание приводит к сбою после нескольких минут работы.
Свойство contents
сохраняет объект, и я не могуявно не выпустить его, потому что я хочу, чтобы исходные изображения оставались в памяти на время выполнения приложения;Кроме того, большое количество сохраняемых данных не учитывает всплески памяти, которые я вижу.
При проверке стека я вижу, что CoreAnimation
вызывает такие функции, как CA::Render::copy_image
, что приводит меняполагать, что это дублирует содержимое слоя где-то вне досягаемости.Я полагаю, что для этого есть веская причина, но незнание того, как и когда это исправить, в настоящее время является ошибкой, препятствующей показу.
Так что может кто-нибудь со сложным знанием CA, пожалуйста, объясните мне, если я что-то делаюнеправильно и как я могу обойти это поведение.
Спасибо.