У меня возникла проблема с CoreGraphics
/CoreAnimation
на iPhone. Чтобы лучше объяснить, как проблема проявляется, я проведу вас через свою текущую настройку и проиллюстрирую код, где это необходимо.Использование памяти CALayer для рисования - неявный кеш?
Я пытаюсь сделать кучу загруженных изображений в UIView
«s CALayer
, но всякий раз, когда изображение отображается, спайки использования памяти приложения и память не утилизированы всякий раз, когда изменения изображений.
Предварительная загрузка изображений осуществляется путем считывания их через объекты UIImage
, превращая их в контекст растрового изображения и извлекая из этого контекста CGImageRef
. Цель этого - распаковать и масштабировать изображения, чтобы эти операции не выполнялись при каждой ничьей. Аналогичную рекомендацию можно найти в Apple Q & A по этому вопросу (поиск CGContextDrawImage
производительности, если вам интересно). Контекст настроен на 8 бит на компонент и предварительно умноженную альфу.
После того, как изображения распаковываются в растровые изображения, они сохраняются в NSArray
и позже назначаются (не сохраняются) в подклассу UIView
, который выполняет чертеж. Я пробовал различные подходы к фактическому рисованию изображений, и, безусловно, самый быстрый метод непосредственно устанавливает свойство CALayer
. Другие методы, такие как drawLayer:inContext:
и drawRect:
, оказывают различное влияние на частоту кадров, но все они имеют одинаковое поведение памяти.
Проблема в том, что после изменения свойств, я вижу всплеск в памяти в Инструментах, и эта память не падает даже после того, как изображение больше не отображается. Объект Allocations остается постоянным, поэтому я предполагаю, что CoreAnimation
создает неявный кеш для ускорения рисования. Однако, как я уже сказал, этот кеш не выпущен, когда это необходимо, и постепенное наращивание приводит к сбою всего за пару минут работы.
Свойство contents
сохраняет объект, и я не могу его явно освободить, потому что я хочу, чтобы исходные изображения оставались в памяти на время выполнения приложения; Кроме того, высокий показатель удержания не учитывает всплески памяти, которые я вижу.
При рассмотрении стека я вижу, что CoreAnimation
выполняет звонки на такие функции, как CA::Render::copy_image
, что заставляет меня думать, что он дублирует содержимое слоя где-то вне досягаемости. Я полагаю, что для этого есть веская причина, но не знаю, как и когда очистить это в настоящее время ошибка остановки шоу.
Так может кто-нибудь с замысловатым знанием CA, пожалуйста, объясните мне, если я что-то делаю неправильно и как я могу обойти это поведение.
Спасибо.
Что именно вы подразумеваете под «чтением их через объекты UIImage»? –
Либо imageWithContentsOfFile: или imageWithData: – SuperNES
Привет всем, Мне кажется, что вы, ребята, лучше понимаете CALayer, что я. У меня есть проблема с Callayer malloc, если кто-нибудь из вас может взглянуть, я был бы очень благодарен ... http://stackoverflow.com/questions/26715727/setneedsdisplay-drawrect-or-calayer-causing-dispatch- продолжение Alloc-с-он – Niall