CATiledLayer и UIImageView, в чем между ними разница?


несколько месяцев назад я нашел действительно классный пример кода с сайта Apple. Пример называется "LargeImageDownsizing". Замечательно то, что он многое объясняет о том, как изображения считываются из ресурсов и затем отображаются на экране.
Копаясь в этом коде, я обнаружил кое-что, что меня немного беспокоит. Изображение уменьшенного размера передается в представление, имеющее CATiledLayer, но не предоставляя фрагмент изображения на каждой плитке для повышения производительности памяти, он просто устанавливает размер плитки, а затем загружает изображение (я упрощаю, чтобы перейти к концепции ).
Итак, мой вопрос в основном заключается в том, почему? Зачем использовать CATiledLayer, если он не подается правильно, они могли бы использовать обычный UIImageView...
Поэтому я сделал несколько тестов, чтобы понять, был ли я прав . Модифицируя код, просто добавьте представление прокрутки с представлением изображения в качестве подпредставления и ответьте на представление делегата прокрутки для масштабирования. К таким выводам я пришел, тестируя устройство и сим:

  1. -Воздействие на память и занимаемая площадь точно такие же, даже во время операции масштабирования и прокрутки, и это меня совсем не удивляет, изображение распаковывается в памяти
  2. - Профиль времени говорит, что тайловое представление требует больше времени для рисования во время операции масштабирования прокрутки вместо uiimageview, и это меня совсем не удивляет снова, uiimageview уже нарисован
  3. -Если я отправлю предупреждение о памяти, между двумя решениями ничего не изменится (только на симе)
  4. - Тестирование производительности Core Animation дало те же результаты при частоте 60 кадров в секунду

Так в чем же дело между этими двумя представлениями/слоями, почему я должен выбрать один вместо другого в этом конкретном случае? UIImageView, кажется, выигрывает битву.

Я надеюсь, что кто-то может помочь мне понять это.


person Andrea    schedule 15.01.2012    source источник


Ответы (1)


Они могут выполнять то же самое для небольших изображений, потому что тогда единственная разница в производительности ОС заключается в том, что CATiledLayer рисует в фоновом потоке. В зависимости от размера плитки CATiledLayer может быть даже медленнее, поскольку ему приходится рисовать несколько плиток для одного изображения.

НО ...

смысл CATiledLayer в том, что вам не нужно рисовать все плитки, особенно при увеличении очень большого изображения. Разумно знать, какие части действительно необходимы. Он также разумно удаляет плитки, которые больше не нужны.

Или этот механизм для работы нужно предоставлять отдельные части изображения по отдельности. Мы говорим об общем размере изображения, которое, вероятно, не может храниться в памяти в несжатом виде.

person Cocoanetics    schedule 15.01.2012
comment
Спасибо, для ясности масштабированное изображение имеет ширину 1555 пикселей и высоту 2236 пикселей. Ваше объяснение имеет смысл. - person Andrea; 15.01.2012