Если я использую UIView.animate, процессор моего Mac сильно загружен на 200%. - PullRequest
2 голосов
/ 14 июня 2019

enter image description here Если я использую UIView.animate для 28 UIViewImages, где их альфа изменилась с альфа = 0 до альфа = 0,5. Симулятор загружает мой Macbook CPU до 200%, но симулятор в отладочном навигаторе XCode показывает 0-4% загрузки процессора. Если я запускаю приложение на iPhone X, все равно. Процессор iPhone составляет 0-4%, но температура устройства высокая. Если я прокомментирую функцию анимации, приложение работает хорошо, и у iPhone нормальная температура Это нормальная ситуация с одновременной анимацией просмотра 28? Или так не должно быть?

Функция добавления вида

func addView() { 
 for _ in 0...27 {     
    imageViews.append(UIImageView(image: UIImage(named: "logo_main")))
 }
 imageViews.forEach{ (view) in
    view.contentMode = .scaleAspectFill
    view.center = CGPoint(x: bounds.midX, y: bounds.maxY + view.bounds.size.height)
    addSubview(view)
 }
    layoutIfNeeded()
}

Функция фонового анимации

func animateBackground() {
        self.imageViews.forEach { view in
            view.alpha = 0
            let rand = TimeInterval(self.imageViews.count.arc4random)
            UIView.animate(withDuration: 3,
                           delay: rand,
                           options: [.repeat, .autoreverse, .curveEaseInOut],
                           animations: { view.alpha = 0,5 },
                           completion: nil)

    }
}

Это нормальное поведение приложения? Может есть другой способ заставить анимированный фон мигать?

Ответы [ 2 ]

1 голос
/ 14 июня 2019

Я не думаю, что вы должны создавать анимацию, накладывая 28 видов друг на друга

Я думаю, что основная проблема с вашим кодом - смешанные с цветом слои . Последний пиксель, который вы видите на экране, представляет собой композицию (то есть смесь) пикселя верхнего слоя и пикселей всех нижележащих слоев. Поэтому каждый нижележащий слой должен быть визуализирован, чтобы создать конечный пиксель, который вы видите на экране. Однако, если слой непрозрачный, процесс компоновки оптимизируется за счет отсутствия прорисовки нижележащих слоев. Например, если вы сложите 28 видов изображений друг на друга, это не сильно повредит процессу визуализации, потому что все виды изображений, кроме верхнего, просто не будут отображаться.

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

«Цветовые смешанные слои» могут значительно снизить производительность вашего приложения. Я бы порекомендовал вам создавать анимацию, обновляя изображения в виде одного изображения или, по крайней мере, уменьшать количество просмотров в вашей анимации.

приписка Я не уверен, что я точно обнаружил вашу проблему с производительностью. Если нет, вы можете найти больше информации об оптимизации производительности рендеринга в этой теме: Что вызывает закадровый рендеринг, смешивание и layoutSubviews в iOS?

0 голосов
/ 14 июня 2019

Это зависит от того, что вы делаете, имейте в виду, что симулятор разделяет ресурсы вашего макинтоша, который также выполняет много других вещей, по крайней мере, xcode (который не требует много ресурсов), сам симулятор и куча других вещей.

Вы никогда не должны тестировать производительность на симуляторе. Это фактически виртуальная машина.

Запустите приложение из XCode непосредственно на устройстве и проверьте производительность процессора и памяти оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...