如果我使用的是UIView.animate,我的Mac的CPU负载为200%

时间:2019-06-14 09:54:40

标签: swift cpu uiviewanimation

enter image description here如果我将UIView.animate用于28个UIViewImages,它们的alpha值从alpha = 0更改为alpha = 0.5。 Simulator可以将我的Macbook CPU最多加载200%,但是XCode调试导航器中的模拟器仅显示0-4%的CPU负载。如果我在iPhone X上运行该应用程序,则全部相同。 iPhone CPU为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 个答案:

答案 0 :(得分:1)

我不认为您应该通过将28个视图彼此叠加来创建动画

我认为您代码的主要问题是颜色混合层。您在屏幕上看到的最终像素是顶层像素和所有下层像素的组合(即混合)。因此,必须渲染每个底层,以创建您在屏幕上看到的最终像素。但是,如果图层不透明,则可以通过不绘制下面的图层来优化合成过程。例如,如果您相互堆叠28个图像视图,则不会对可视化过程造成很大的损害,因为除了顶部图像视图之外的所有图像视图都不会被渲染。

不幸的是,在源代码中没有优化,因为您不断更改彼此堆叠的图像视图的alpha属性。在最坏的情况下,必须对所有28个图像视图执行混合过程。您可以通过在模拟器中检查“调试>颜色混合图层”来检查动画中是否存在“颜色混合”。

“颜色混合层”会大大降低应用程序的性能。我建议您通过更新单个图像视图中的图像来创建动画,或者至少减少动画中的视图数量。

PS 我不确定我是否完美检测到您的性能问题。如果没有,您可以在此线程中找到有关优化渲染性能的更多信息:What triggers offscreen rendering, blending and layoutSubviews in iOS?

答案 1 :(得分:0)

这取决于您的工作,请记住,模拟器也共享运行许多其他内容的mac的资源,至少是xcode(这与资源的使用情况无关),模拟器本身还有其他一些东西

永远不要真正在模拟器上测试性能。它实际上是一个虚拟机。

直接从Xcode在设备上运行应用程序,然后从那里检查CPU和内存性能。