Arrays 在swift中快速渲染CALayers阵列和CAShapeLayers阵列

Arrays 在swift中快速渲染CALayers阵列和CAShapeLayers阵列,arrays,swift,calayer,cashapelayer,cgpath,Arrays,Swift,Calayer,Cashapelayer,Cgpath,我正在编写一个应用程序,其中我需要使用先前定义的贝塞尔路径填充500层左右的层,并且根据我选择的路径,我遇到了性能或交互性问题。请注意,我不需要动画功能,因为我绘制的路径是静态的: 如果我使用CALayers,绘制到屏幕的路径大约需要15秒(不好),但由此产生的交互体验(即在屏幕上移动)非常好 如果我使用CAShapeLayers,绘制到屏幕的路径需要几分之一秒的时间(很好),但是交互性很差 这是我与CALayers的代码: func drawPathToCALayer (myView: UII

我正在编写一个应用程序,其中我需要使用先前定义的贝塞尔路径填充500层左右的层,并且根据我选择的路径,我遇到了性能或交互性问题。请注意,我不需要动画功能,因为我绘制的路径是静态的:

如果我使用CALayers,绘制到屏幕的路径大约需要15秒(不好),但由此产生的交互体验(即在屏幕上移动)非常好

如果我使用CAShapeLayers,绘制到屏幕的路径需要几分之一秒的时间(很好),但是交互性很差

这是我与CALayers的代码:

func drawPathToCALayer (myView: UIImageView, pointArray: [CGPoint], bbox: CGRect, color: UIColor) {

// step 1. create path
let path = CGPathCreateMutable()
var pathOffset = CGAffineTransformMakeTranslation( (bbox.origin.x * -1), (bbox.origin.y * -1))
CGPathAddLines(path, &pathOffset, pointArray, pointArray.count)
CGPathCloseSubpath(path)

// step 2. draw to context -- this is the part that kills the amount of time that we call this function repeatedly

UIGraphicsBeginImageContextWithOptions(bbox.size, false, 0)
CGContextAddPath(UIGraphicsGetCurrentContext(), path)
CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(), color.CGColor)
CGContextFillPath(UIGraphicsGetCurrentContext())

// step 3.  assign context drawing to sublayer
let sublayer = CALayer()
let strokeImage = UIGraphicsGetImageFromCurrentImageContext()
sublayer.frame = bbox
sublayer.contents = strokeImage.CGImage

UIGraphicsEndImageContext()
myView.layer.addSublayer(sublayer)
这是使用CAShapeLayers的代码

func drawPathToCAShapeLayer (myView: UIImageView, pointArray: [CGPoint], bbox: CGRect, color: UIColor) {

// step 1. create path
let path = CGPathCreateMutable()
var pathOffset = CGAffineTransformMakeTranslation( (bbox.origin.x * -1), (bbox.origin.y * -1))
CGPathAddLines(path, &pathOffset, pointArray, pointArray.count)
CGPathCloseSubpath(path)

// step 2.  assign path to sublayer
let sublayer = CAShapeLayer()
sublayer.path = path
sublayer.fillColor = color
myView.layer.addSublayer(sublayer)
我喜欢CAShapeLayer方法的简洁性和速度,但从交互性的角度来看,这条路线是行不通的

问题是(谢谢你一直在那里),有没有一种方法可以做一个混合的方法,我临时画一个CAShapeLayer,然后用它来填充这样的CALayer

func drawPathToHybrid (myView: UIImageView, pointArray: [CGPoint], bbox: CGRect, color: UIColor) {

// step 1. create path
let path = CGPathCreateMutable()
var pathOffset = CGAffineTransformMakeTranslation( (bbox.origin.x * -1), (bbox.origin.y * -1))
CGPathAddLines(path, &pathOffset, pointArray, pointArray.count)
CGPathCloseSubpath(path)

// step 2.  assign path to sublayer
let sublayer = CALayer()
let tmplayer = CAShapeLayer()
tmplayer.path = path
tmplayer.fillColor = color
sublayer.contents = tmplayer.contents  // ---> i know this doesn't work, but is there something similar I can take advantage of that doesn't rely on defining a context?
myView.layer.addSublayer(sublayer)

或者更好的是,是否有其他方法可以用bezier路径填充Calayer数组,以获得良好的交互性和性能

你什么时候会受到性能和/或互动性方面的惩罚?启动过程是一次性的,还是在屏幕需要刷新时进行的?你可以看看SpriteKit,它设计用于处理数百个小对象的高速刷新。如果你要在屏幕上移动数百层,那么无论哪种方式都会有性能问题。有什么原因不能将所有路径绘制到一个图层中吗?我正在构建的应用程序是一个绘图应用程序。我之所以不画一层的路径,是因为我希望能够及时向后或向前“擦洗”,以便可以随意添加或删除笔划。因此,虽然我不需要四处移动图层,但我确实希望能够快速添加/删除图层并放大/缩小视图。使用CALayers,我可以有大约500层,没有滞后问题。我试图解决的问题是如何在没有明显延迟的情况下一次画出所有的图。我可以用CAShape图层来做这件事,但是放大和缩小视图是非常滞后的。谢谢David。我会调查的。为了澄清,我看到的性能冲击发生在我尝试绘制时,比如说一次绘制500层。我正试图将这段时间缩短到与使用CAShape图层做同样的事情的时间。我不使用CAShape图层,因为尽管屏幕绘制时间很长,但移动中的任何交互都非常糟糕。