使用位图 CGContext 绘图不断增加内存使用
Ever increasing memory usage with bitmap CGContext drawing
我正在尝试移动 CGLayer 中的子区域内容。主要思想是我首先将源区域(我要移动的部分)绘制到新创建的位图 CGContext 中,然后从中创建一个 CGImage,并将其绘制回不同位置的原始层。这是有问题的代码片段:
let size = src.size
//create the bitmap context
UIGraphicsBeginImageContextWithOptions(size, true, 0)
guard let ctx = UIGraphicsGetCurrentContext() else { return }
ctx.saveGState()
//flip the context to match the origin position of UIKit
ctx.translateBy(x: 0, y: size.height)
ctx.scaleBy(x: 1.0, y: -1.0)
//draw the source part of the layer into the bitmap context
let offset = CGPoint(x: -src.origin.x, y: -src.origin.y)
let iRect = CGRect(origin: offset, size: self.shellBounds.size)
let bounds = CGRect(origin: .zero, size: size)
ctx.clip(to: bounds)
ctx.draw(layer, in: iRect)
//make a CGImage of the contents
let image = ctx.makeImage()!
//draw this part back to the layer (context is obtained from layer)
context.saveGState()
context.clip(to: target)
context.setBlendMode(.copy)
context.draw(image, in: target)
context.restoreGState()
ctx.restoreGState()
UIGraphicsEndImageContext()
这按预期工作。但是,问题是,每次调用都会占用内存。
内存增加可能是因为制作图像。但是好像最后没有发布。我的代码片段有什么问题?是否需要手动释放创建的镜像?如果是这样,我该怎么做,因为 Swift 如文档中所述将 ARC 用于 Core Graphics?
原来内存问题是在再次将生成图像绘制到图层时开始的(当将生成图像绘制回图层的部分被注释掉时,内存不再增加)。
由于CGLayer的内部实现未知,所以很难知道这个问题的确切原因。我所做的只是放弃这个方法,换一种方式实现。
我正在尝试移动 CGLayer 中的子区域内容。主要思想是我首先将源区域(我要移动的部分)绘制到新创建的位图 CGContext 中,然后从中创建一个 CGImage,并将其绘制回不同位置的原始层。这是有问题的代码片段:
let size = src.size
//create the bitmap context
UIGraphicsBeginImageContextWithOptions(size, true, 0)
guard let ctx = UIGraphicsGetCurrentContext() else { return }
ctx.saveGState()
//flip the context to match the origin position of UIKit
ctx.translateBy(x: 0, y: size.height)
ctx.scaleBy(x: 1.0, y: -1.0)
//draw the source part of the layer into the bitmap context
let offset = CGPoint(x: -src.origin.x, y: -src.origin.y)
let iRect = CGRect(origin: offset, size: self.shellBounds.size)
let bounds = CGRect(origin: .zero, size: size)
ctx.clip(to: bounds)
ctx.draw(layer, in: iRect)
//make a CGImage of the contents
let image = ctx.makeImage()!
//draw this part back to the layer (context is obtained from layer)
context.saveGState()
context.clip(to: target)
context.setBlendMode(.copy)
context.draw(image, in: target)
context.restoreGState()
ctx.restoreGState()
UIGraphicsEndImageContext()
这按预期工作。但是,问题是,每次调用都会占用内存。
内存增加可能是因为制作图像。但是好像最后没有发布。我的代码片段有什么问题?是否需要手动释放创建的镜像?如果是这样,我该怎么做,因为 Swift 如文档中所述将 ARC 用于 Core Graphics?
原来内存问题是在再次将生成图像绘制到图层时开始的(当将生成图像绘制回图层的部分被注释掉时,内存不再增加)。
由于CGLayer的内部实现未知,所以很难知道这个问题的确切原因。我所做的只是放弃这个方法,换一种方式实现。