iOS CGContext性能不佳

时间:2016-11-21 01:56:05

标签: ios swift performance cgcontext

我写了一个每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
}

1 个答案:

答案 0 :(得分:1)

我认为apptoach并不好。如果要显示动画内容,则不应重绘视图。你应该使用CoreAnimation。好消息是易于实施。坏消息是它需要一点点学习。 ;)

对您的代码提出一些建议:

  1. 您的绘图的某些部分似乎常量。因此,我不能一次又一次地重绘。相反,你可以将它放在一个单独的层中。
  2. 正如@rmaddy建议您需要许多sincos次计算。但这些值应始终相同。所以你可以计算一次并缓存它们。
  3. 您可以在draw(in:)中实现绘图,并为代码的所有可变部分使用动态属性。您可以使用CoreAnimation中的动画然后为绘图设置动画。在Swift中创建动态CA属性有点棘手。 (据我所知,你必须用@NSManaged(!)注释它们,你必须覆盖needsDisplay(forKey:)并为它们返回true。)。