我写了一个每1/60秒调用一次的渲染函数。它如下所示。基本上,它使用正弦渲染40个径向模式的线。它看起来像http://imgur.com/a/kPKtT。当我在打开调试器的iPhone 6s上运行它时,它显示它正在使用大约60%的CPU并且它只是使“高”电池使用水平。这对我来说似乎不对,它只有40条简单的线条吗?
我能更高效地做到这一点吗?我应该尝试使用像CALayer或Metal这样的其他东西来获得更好的性能吗?顺便说一句,我就是一个菜鸟。
func render() { tick += 0.01
let renderer = UIGraphicsImageRenderer(size: CGSize(width: 375, height: 667))
let img = renderer.image { ctx in
let c = ctx.cgContext
// Set background
let background = CGRect(x: 0, y: 0, width: 375, height: 667)
c.setFillColor(UIColor.black.cgColor)
c.addRect(background)
c.drawPath(using: .fillStroke)
// Function to draw a line
func line(p1:CGPoint, p2:CGPoint) {
let line = CGRect(x: 0, y: 0, width: 200, height: 200)
c.addLines(between: [p1,p2])
c.drawPath(using: .fillStroke)
}
// Draw lines
c.setStrokeColor(UIColor.white.cgColor)
c.setLineWidth(1)
c.setLineCap(CGLineCap.round)
for i in 0...39 {
let n:CGFloat = CGFloat(i) * CGFloat.pi/40
let d:CGFloat = sin(tick + CGFloat(i)*CGFloat.pi/5)*20 + 100
line(p1: CGPoint(x: d*cos(tick+n)+187.5, y: d*sin(tick+n)+333.5),
p2: CGPoint(x: d*cos(tick+n+CGFloat.pi)+187.5, y: d*sin(tick+n+CGFloat.pi)+333.5))
}
}
imageView.image = img
}
答案 0 :(得分:1)
我认为apptoach并不好。如果要显示动画内容,则不应重绘视图。你应该使用CoreAnimation。好消息是易于实施。坏消息是它需要一点点学习。 ;)
对您的代码提出一些建议:
sin
和cos
次计算。但这些值应始终相同。所以你可以计算一次并缓存它们。@NSManaged
(!)注释它们,你必须覆盖needsDisplay(forKey:)并为它们返回true
。)。