所以,我有一个CIImage
我试图用NSView
's-drawRect
方法绘制的东西。
这是我用来绘制图像的代码行:
[outputCoreImage drawInRect: [self bounds]
fromRect: originalBounds
operation: NSCompositeSourceOver
fraction: 1];
outputCoreImage
, originalBounds
, 和[self bounds]
都是非nil
, 并且确实是它们各自的期望值。在 Lion (OS X 10.7) 上,这工作得很好,但是在 Mountain Lion (OS X 10.8) 上,我收到了EXC_BAD_ACCESS
这条线路。如果我走上堆栈,我会发现中断的内部函数调用是 on CGLGetPixelFormat
。
frame #0: 0x00007fff99c3b26d OpenGL`CGLGetPixelFormat + 27
frame #1: 0x00007fff8fa98978 CoreImage`-[CIOpenGLContextImpl createAccelContext] + 335
frame #2: 0x00007fff8fa98d30 CoreImage`-[CIOpenGLContextImpl updateContext] + 111
frame #3: 0x00007fff8fa9a865 CoreImage`-[CIOpenGLContextImpl _lockfeContext] + 25
frame #4: 0x00007fff8fa7e4ac CoreImage`-[CIContextImpl setObject:forKey:] + 120
frame #5: 0x00007fff8fa9881c CoreImage`-[CIOpenGLContextImpl setObject:forKey:] + 259
frame #6: 0x00007fff90db93e3 libCGXCoreImage.A.dylib`cgxcoreimage_instance_render + 1477
frame #7: 0x00007fff97074ac6 CoreGraphics`CGSCoreImageInstanceRender + 32
frame #8: 0x00007fff947c89cc libRIP.A.dylib`ripc_AcquireCoreImage + 1344
frame #9: 0x00007fff947b8a00 libRIP.A.dylib`ripc_DrawShading + 9680
frame #10: 0x00007fff96cb2b2b CoreGraphics`CGContextDrawShading + 51
frame #11: 0x00007fff8fa78237 CoreImage`-[CICGContextImpl render:] + 918
frame #12: 0x00007fff8fa7d76a CoreImage`-[CIContext drawImage:inRect:fromRect:] + 1855
frame #13: 0x00007fff9897b8f3 AppKit`-[CIImage(NSAppKitAdditions) drawInRect:fromRect:operation:fraction:] + 243
我打开了僵尸、守卫 malloc 和日志异常,但它们都没有返回任何有用的信息。
其他 OpenGL 测试:
我添加了这个块:
CIImage *anImage = [[CIImage alloc] init];
[[[self window] contentView] lockFocus];
{
[anImage drawInRect: [[self window] frame]
fromRect: [[self window] frame]
operation: NSCompositeSourceOver
fraction: 1];
}
[[[self window] contentView] unlockFocus];
到-windowDidLoad
我的方法NSWindowController
。它运行没有问题。
我添加了这个块:
NSData *data = [NSData dataWithContentsOfURL: [NSURL URLWithString: @"http://cache.virtualtourist.com/14/684723-Red_Square_Moscow.jpg"]];
CIImage *anImage = [[CIImage alloc] initWithData: data];
[self lockFocus];
{
[anImage drawInRect: [self bounds]
fromRect: [anImage extent]
operation: NSCompositeSourceOver
fraction: 1];
}
[self unlockFocus];
给别人NSView
的-drawRect
。我收到了同样的错误CGLGetPixelFormat
。
雷达:
#macdev 的人们似乎认为这是操作系统问题,我不倾向于不同意。我已经提交了一个雷达(rdar://11980704)来解释问题并链接回这个问题。
解决方法:
CGContextRef contextReference = [[NSGraphicsContext currentContext] graphicsPort];
CIContext *coreImageContext = [CIContext contextWithCGContext: contextReference
options: @{kCIContextUseSoftwareRenderer : @YES}];
[coreImageContext drawImage: outputCoreImage
inRect: [self bounds]
fromRect: originalBounds];
看起来强制使用软件渲染器绘制图像“解决”了这个问题。它有点模糊和缓慢,但它不会崩溃。