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

If I am using UIView.animate CPU of my Mac is high loaded on 200%

如果我对 28 个 UIViewImage 使用 UIView.animate,其中它们的 alpha 从 alpha = 0 更改为 alpha = 0.5。模拟器加载我的 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)

    }
}

这是应用程序的正常行为吗? 也许还有另一种方法可以使动画背景闪烁?

这取决于你在做什么,请记住,模拟器共享你的 mac 的资源,这也是 运行 很多其他东西,至少 xcode (这对资源使用并不重要),模拟器本身和其他一些东西。

您永远不应该在模拟器上真正测试性能。它实际上是一个虚拟的 machine。

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

我认为您不应该通过将 28 个视图相互堆叠来创建动画

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

不幸的是,在您的源代码中没有优化,因为您不断更改 alpha 属性 图像视图相互堆叠。在最坏的情况下,必须对所有 28 个图像视图执行混合过程。您可以通过检查模拟器中的 "Debug > Color Blended Layers" 来检查动画中是否存在 "color blending"。

"color blended layers" 会显着降低应用的性能。我建议您通过更新单个图像视图中的图像或至少减少动画中的视图数来创建动画。

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