Решение для оптимизации производительности iOS

1. Запустить оптимизацию

1. Холодный старт (начать с нуля)

Три этапа холодного запуска

1.1 Перед выполнением основной функции

  • Загрузить исполняемый файл (файл mach-o)
  • Загрузите библиотеку динамической компоновки, выполните настройку указателя перебазирования и привязку символа.
  • Обработка инициализации среды выполнения Objc, включая регистрацию классов, связанных с Objc, регистрацию категорий и проверку уникальности селектора.
  • Инициализация, включая выполнение метода +load(), вызовы функций, измененные атрибутом((конструктором)), и создание статических глобальных переменных C++.

Оптимизация

  • Уменьшите динамическую загрузку библиотеки . Каждая библиотека сама по себе имеет зависимости. Apple рекомендует использовать меньше динамических библиотек и пытаться объединить несколько динамических библиотек при использовании большого количества динамических библиотек. Что касается количества, Apple рекомендует использовать до 6 несистемных динамических библиотек.
  • Уменьшите загрузку классов или методов, которые не будут использоваться после запуска.
  •  Содержимое метода  +load() может быть выполнено после завершения рендеринга первого экрана или заменено методом +initialize() .   Потому что в методе +load()  операция замены метода во время выполнения приведет к потреблению 4 миллисекунд. Не стоит недооценивать эти 4 миллисекунды. Немногое складывается. Выполнение метода +load() будет оказывать все большее влияние на скорость запуска.
  • Контролируйте количество  глобальных переменных C++ 

1.2 После выполнения основной функции

В основном относится к началу выполнения функции main() и выполнению методов, связанных с рендерингом первого экрана, в методе DidFinishLaunchingWithOptions Appdelegate .

  • Операции чтения и записи файлов конфигурации, необходимые для инициализации первого экрана.
  • Чтение больших данных из списка первого экрана
  • Множество вычислений для рендеринга выше сгиба.

Оптимизация

Функционально разобраться, какие функции инициализации необходимы для отрисовки первого экрана, какие необходимы для запуска приложения, а какие необходимо инициализировать только тогда, когда соответствующая функция начнет использоваться. Разобравшись, разложите эти функции инициализации по соответствующим этапам.

1.3 Рендеринг первого экрана завершен

Начинается, когда рендеринг завершен, и   заканчивается, когда заканчивается область действия метода DidFinishLaunchingWithOptions .

Оптимизация

  • Оптимизация функционального уровня:   
    после начала выполнения функции main() и до завершения рендеринга первого экрана обрабатываются только операции, связанные с первым экраном. Инициализация других служб, не относящихся к первому экрану, мониторинг регистрации, чтение файла конфигурации и т. д. все это делается после завершения рендеринга первого экрана.
  • Оптимизация на уровне метода   
    проверяет, какие трудоемкие методы находятся в основном потоке, до завершения рендеринга первого экрана, а также задерживает или асинхронно выполняет ненужные трудоемкие методы. Обычно трудоемкий метод в основном возникает при расчете большого объема данных.Специфической производительностью является загрузка, редактирование и хранение ресурсов, таких как изображения и файлы.

2. Горячий старт

  • Приложение находится в памяти и работает в фоновом режиме. Нажмите значок еще раз, чтобы войти в приложение.

3. Методы мониторинга запуска приложения.

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

2. Проблема Катона

2.1 Сумма ЦП ГП

CUP (Центральный процессор, центральный процессор)

Создание и уничтожение объектов, настройка атрибутов объекта, расчет макета, расчет и верстка текста, преобразование и декодирование формата изображения, рисование изображений (Core Graphics)

Решение для оптимизации CUP

  • Попробуйте использовать облегченные объекты. Например, там, где обработка событий не требуется, вы можете рассмотреть возможность использования CALayer вместо UIView.
  • Не изменяйте часто связанные свойства UIView, такие как рамка, границы, преобразование и т. д.
  • Постарайтесь заранее просчитать макет , рассчитать рамку, границы и т. д. и изменить это один раз , а не несколько раз ;
  • Использование Autolayout потребует больше ресурсов, чем непосредственная установка фрейма.
  • Лучше всего поддерживать размер изображения в соответствии с размером UIImageView, чтобы уменьшить ресурсы ЦП для операций масштабирования;
  • Контролируйте максимальное количество одновременных потоков
  • Попробуйте вынести трудоемкие операции в подпотоки (размер текста, обработка изображений).

GPU (графический процессор, графический процессор)

Рендеринг текстур

Решение для оптимизации графического процессора

  • Максимально сократите количество и уровни представлений. Отрисовка многоуровневых представлений требует больше ресурсов графического процессора.
  • Старайтесь избегать показа большого количества изображений за короткий период времени и старайтесь объединить несколько изображений в одно для отображения.
  • Максимальный размер изображения , который может обработать графический процессор, составляет 4096x4096. Как только этот размер будет превышен, ресурсы процессора будут заняты для обработки, поэтому текстура не должна превышать этот размер, насколько это возможно.
  • Уменьшите прозрачность вида (альфа<1). Если есть прозрачность, требуется расчет смешивания . Если она не прозрачна, установите для непрозрачности значение ДА.

2.2 Рендеринг за кадром (старайтесь избегать рендеринга за кадром)

В OpenGL графический процессор имеет 2 метода рендеринга.

  • Рендеринг на экране: текущий рендеринг экрана, операции рендеринга выполняются в экранном буфере, используемом в данный момент для отображения.
  • Внеэкранный рендеринг: внеэкранный рендеринг, открытие нового буфера за пределами текущего экранного буфера для операций рендеринга.

Причины, по которым рендеринг за кадром снижает производительность

  • Необходимо создать новый буфер
  • Весь процесс закадрового рендеринга требует многократного переключения контекстной среды: сначала переключение с текущего экрана (On-Screen) на закадровый (Off-Screen), после завершения закадрового рендеринга рендеринг результаты закадрового буфера отображаются на экране, необходимо переключить контекст с закадрового на текущий экран

Оптимизация

  • Растеризация, сократите использование Layer.shouldRasterize = YES
  • Маска, сократите использование Layer.mask
  • Скругленные углы, уменьшите и установите Layer.masksToBounds = YES, Layer.cornerRadius больше 0 (вы можете нарисовать и обрезать закругленные углы с помощью CoreGraphics или попросить пользовательский интерфейс предоставить изображения с закругленными углами).
  • Shadow, сократите использование Layer.shadowXXX (если установлен Layer.shadowPath, рендеринг за кадром не произойдет)

3. Оптимизация энергопотребления

  • Максимально сократите энергопотребление процессора и графического процессора.
  • Используйте таймеры экономно
  • Оптимизация операций ввода-вывода
  • Старайтесь не записывать часто небольшие данные. Лучше всего записывать сразу пакетами.
  • При чтении и записи больших объемов важных данных рассмотрите возможность использования send_io, который предоставляет API для асинхронных операций ввода-вывода файлов на основе GCD. Используя диспетчер_io, система оптимизирует доступ к диску.
  • Если объем данных относительно большой, рекомендуется использовать базу данных (например, SQLite, CoreData).

4. Оптимизация сети

  • Уменьшайте и сжимайте сетевые данные
  • Если результаты нескольких запросов одинаковы, попробуйте использовать кеширование
  • Используйте возобновление точки останова, иначе один и тот же контент может передаваться несколько раз, когда сеть нестабильна.
  • Не пытайтесь выполнять сетевые запросы, когда сеть недоступна.
  • Разрешить пользователям отменять длительные или медленные сетевые операции и устанавливать соответствующие таймауты.
  • При пакетной передаче, например, при загрузке видеопотока, не передавайте очень маленькие пакеты, загружайте весь файл напрямую или скачивайте его большими кусками. Если вы загружаете рекламу, загружайте больше сразу, а затем медленно отображайте ее. При загрузке электронных писем загружайте несколько писем одновременно, не загружайте их одно за другим.

5. Оптимизация позиционирования

  • Если вам просто нужно быстро определить местоположение пользователя, лучше всего использовать метод requestLocation класса CLLocationManager. После завершения позиционирования оборудование позиционирования автоматически отключится.
  • Если это не навигационное приложение, постарайтесь не обновлять местоположение в режиме реального времени и отключите службу определения местоположения после завершения определения местоположения.
  • Постарайтесь максимально снизить точность позиционирования, например, не используйте kCLLocationAccuracyBest, который имеет самую высокую точность.
  • Если требуется фоновое позиционирование, попробуйте установить для паузыLocationUpdatesAutomatically значение YES. Система автоматически приостановит обновление местоположения, если пользователь вряд ли двинется.
  • Старайтесь не использовать startMonitoringSignificantLocationChanges, отдавайте приоритет startMonitoringForRegion:
  • Когда пользователь перемещает, встряхивает или наклоняет устройство, генерируются события движения, и эти события обнаруживаются оборудованием, таким как акселерометры, гироскопы и магнитометры. В ситуациях, когда обнаружение не требуется, это оборудование следует вовремя отключить.

Guess you like

Origin blog.csdn.net/baidu_33298752/article/details/130947044
ios