如果我将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)
}
}
这是应用程序的正常行为吗? 也许还有另一种方法可以使动画背景闪烁?
答案 0 :(得分:1)
我不认为您应该通过将28个视图彼此叠加来创建动画
我认为您代码的主要问题是颜色混合层。您在屏幕上看到的最终像素是顶层像素和所有下层像素的组合(即混合)。因此,必须渲染每个底层,以创建您在屏幕上看到的最终像素。但是,如果图层不透明,则可以通过不绘制下面的图层来优化合成过程。例如,如果您相互堆叠28个图像视图,则不会对可视化过程造成很大的损害,因为除了顶部图像视图之外的所有图像视图都不会被渲染。
不幸的是,在源代码中没有优化,因为您不断更改彼此堆叠的图像视图的alpha
属性。在最坏的情况下,必须对所有28个图像视图执行混合过程。您可以通过在模拟器中检查“调试>颜色混合图层”来检查动画中是否存在“颜色混合”。
“颜色混合层”会大大降低应用程序的性能。我建议您通过更新单个图像视图中的图像来创建动画,或者至少减少动画中的视图数量。
PS 我不确定我是否完美检测到您的性能问题。如果没有,您可以在此线程中找到有关优化渲染性能的更多信息:What triggers offscreen rendering, blending and layoutSubviews in iOS?
答案 1 :(得分:0)
这取决于您的工作,请记住,模拟器也共享运行许多其他内容的mac的资源,至少是xcode(这与资源的使用情况无关),模拟器本身还有其他一些东西
永远不要真正在模拟器上测试性能。它实际上是一个虚拟机。
直接从Xcode在设备上运行应用程序,然后从那里检查CPU和内存性能。