我正在尝试layers: [CGImageRef]
在drawLayer(thisLayer: CALayer!, inContext ctx: CGContext!)
我的 custom 例程中进行 alpha 混合NSView
。到目前为止,我一直CGContextDrawImage()
将这些图层绘制到 drawLayer 上下文中。在进行分析时,我注意到CGContextDrawImage()
需要 70% 的 CPU 时间,因此我决定尝试 Accelerate 框架。我更改了代码,但它只是崩溃了,我不知道可能是什么原因。
我正在创建这样的图层:
func addLayer() {
let colorSpace: CGColorSpaceRef = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB)
let bitmapInfo = CGBitmapInfo(CGImageAlphaInfo.PremultipliedFirst.rawValue)
var layerContext = CGBitmapContextCreate(nil, UInt(canvasSize.width), UInt(canvasSize.height), 8, UInt(canvasSize.width * 4), colorSpace, bitmapInfo)
var newLayer = CGBitmapContextCreateImage(layerContext)
layers.append( newLayer )
}
我的 drawLayers 例程如下所示:
override func drawLayer(thisLayer: CALayer!, inContext ctx: CGContext!)
{
var ctxImageBuffer = vImage_Buffer(data:CGBitmapContextGetData(ctx),
height:CGBitmapContextGetHeight(ctx),
width:CGBitmapContextGetWidth(ctx),
rowBytes:CGBitmapContextGetBytesPerRow(ctx))
for imageLayer in layers
{
//CGContextDrawImage(ctx, CGRect(origin: frameOffset, size: canvasSize), imageLayer)
var inProvider:CGDataProviderRef = CGImageGetDataProvider(imageLayer)
var inBitmapData:CFDataRef = CGDataProviderCopyData(inProvider)
var buffer:vImage_Buffer = vImage_Buffer(data: &inBitmapData, height:
CGImageGetHeight(imageLayer), width: CGImageGetWidth(imageLayer), rowBytes:
CGImageGetBytesPerRow(imageLayer))
vImageAlphaBlend_ARGB8888(&buffer, &ctxImageBuffer, &ctxImageBuffer, 0)
}
}
canvasSize 总是相同的,并且所有图层的大小都相同,所以我不明白为什么最后一行会崩溃。
我也看不到如何使用新的便利函数直接从 CGLayerRefs 创建 vImageBuffers。这就是为什么我用复杂的方式来做这件事。
任何帮助表示赞赏。
编辑
inBitmapData
确实包含反映我设置的背景颜色的像素数据。但是,调试器不能po &inBitmapData
并且失败并显示此消息:
错误:对“CFData”的引用未用于初始化 inout 参数 &inBitmapData
所以我寻找一种方法来获取指向 inBitmapData 的指针。这就是我想出的:
var bitmapPtr: UnsafeMutablePointer<CFDataRef> = UnsafeMutablePointer<CFDataRef>.alloc(1)
bitmapPtr.initialize(inBitmapData)
我还必须更改指向 alpha 混合输入所需的两个缓冲区的数据的方式。现在它不再崩溃了,幸运的是,可以使用分析器检查速度提升(vImageAlphaBlend
只需要大约三分之一CGContextDrawImage
),但不幸的是,图像会导致透明图像出现像素故障,而不是白色图像背景。
到目前为止,我不再收到任何运行时错误,但由于结果不如预期,我担心我仍然没有正确使用 alpha blend 函数。