gpt4 book ai didi

swift - UIBezierPath 的快速替代品

转载 作者:搜寻专家 更新时间:2023-11-01 06:53:26 25 4
gpt4 key购买 nike

我正在制作可以构建图表的应用程序。我正在使用 UIBezierPath,一切都很好,直到我决定使用手势移动和缩放图形成为可能。

我是这样画的:

var isFirstPoint = true
color.set()
funcPath.lineWidth = width

for i in 0...Int(bounds.size.width * contentScaleFactor) {
let cgX = CGFloat(i) / contentScaleFactor
let funcX = Double ((cgX - bounds.width / 2) / scale)

let funcY = function(funcX) * Double(scale)

guard !funcY.isNaN else { continue }
let cgY = -( CGFloat(funcY) - bounds.height / 2)

if isFirstPoint {
funcPath.move(to: CGPoint(x: cgX, y: cgY))
isFirstPoint = false
} else {
if cgY > max(bounds.size.width, bounds.size.height) * 2 {
isFirstPoint = true
} else {
funcPath.addLine(to: CGPoint(x: cgX, y: cgY) )
}
}
}
funcPath.stroke()

有没有更快的方法呢?

最佳答案

几个想法:

  1. 为每个像素重建路径可能是一个代价高昂的过程。降低此成本的一种方法是减少渲染的数据点数量。例如,如果您正在调整 scale 并重建整个路径,您可能希望在更新路径中间手势时使用一些 step 因子,并替换您的 for 循环:

    let step = 4
    for i in stride(from: 0, through: Int(bounds.size.width * contentScaleFactor), by: step) {
    ...
    }

    然后,当手势结束时,您可能会再次更新路径,step1

  2. 另一种方法是更新scale 并每次都调用setNeedsDisplay,而只是更新 View 的 transform。 (这会在放大时产生超快的行为,但在缩小时显然会出现问题,因为从路径中排除的部分不会被渲染。)

  3. 如果您要对此进行测试,请确保测试在物理设备上构建的版本(即优化版)。调试构建及其所有安全检查确实会减慢流程,这将在像这样的计算密集型项目中脱颖而出。

  4. 顺便说一句,看起来路径的构建被埋在了draw(rect:)中。我会将 UIBezierPath 的构建与路径的描边分离,因为虽然,是的,每次更新函数时,您可能想要更新并绘制路径,但您肯定不想要每次调用 draw(rect:) 时都重新构建路径。

  5. 一旦你这样做了,draw(rect:) 可能甚至都不需要了。您可能只是添加一个 CAShapeLayer 作为 View 层的子层,设置该形状层的 strokeColorstrokeWidth,然后更新它的 路径

关于swift - UIBezierPath 的快速替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55518291/

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