绘制屏幕外CALayer内容的最快方法

时间:2017-09-04 02:21:13

标签: core-graphics core-animation

我正在寻找在macOS上绘制屏幕外CALayer内容(不需要alpha)的最快方法。请注意,这些示例没有线程化,但重点是(为什么我不只是使用CALayer.setNeedsDisplay),因为我正在后台线程上进行此绘图。

我的原始代码执行了此操作:

let bounds = layer.bounds.size
let contents = NSImage(size: size)
contents.lockFocusFlipped(true)
let context = NSGraphicsContext.current()!.cgContext
layer.draw(in: context)
contents.unlockFocus()
layer.contents = contents

1 个答案:

答案 0 :(得分:1)

我目前的最佳状态是相当快:

let contentsScale = layer.contentsScale
let width = Int(bounds.width * contentsScale)
let height = Int(bounds.height * contentsScale)
let bytesPerRow = width * 4
let alignedBytesPerRow = ((bytesPerRow + (64 - 1)) / 64) * 64

let context = CGContext(
    data: nil,
    width: width,
    height: height,
    bitsPerComponent: 8,
    bytesPerRow: alignedBytesPerRow,
    space: NSScreen.main()?.colorSpace?.cgColorSpace ?? CGColorSpaceCreateDeviceRGB(),
    bitmapInfo: CGImageAlphaInfo.noneSkipLast.rawValue
)!

context.scaleBy(x: contentsScale, y: contentsScale)
layer.draw(in: context)
layer.contents = context.makeImage()

欢迎提供更好/更快的提示和建议。