CATiledLayer и UIImageView, в чем дело между ними? - PullRequest
2 голосов
/ 15 января 2012


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

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

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

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

1 Ответ

0 голосов
/ 15 января 2012

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

НО ...

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

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

...