gpt4 book ai didi

iOS CGContext 性能不佳

转载 作者:行者123 更新时间:2023-11-28 06:29:40 28 4
gpt4 key购买 nike

我编写了一个渲染函数,每 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
}

最佳答案

我认为 apptoach 不好。当你想显示动画内容时,你不应该重绘 View 。你应该使用 CoreAnimation。好消息是它易于实现。坏消息是它需要一点点学习。 ;)

对您的代码的一些建议:

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

关于iOS CGContext 性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40711716/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com