2017-09-04 106 views
2

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

我的原代码,这样做:

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 

回答

0

我现在最好的是一个相当快一点:

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() 

提示和建议,使之更好/更快的欢迎。