CIImage dibujo EXC_BAD_ACCESS
-
12-12-2019 - |
Pregunta
Así que tengo un CIImage
que estoy tratando de dibujar en un NSView
's -drawRect
método.
Esta es la línea de código que me llame para dibujar la imagen:
[outputCoreImage drawInRect: [self bounds]
fromRect: originalBounds
operation: NSCompositeSourceOver
fraction: 1];
outputCoreImage
, originalBounds
, y [self bounds]
son todos los no-nil
, y, de hecho, son sus respectivos valores esperados.En Lion (OS X 10.7), este funcionaba bien, sin embargo en Mountain Lion (OS X 10.8) que voy a recibir una EXC_BAD_ACCESS
en esta línea.Si estoy de pie arriba de la pila, me parece que el interior de la llamada a la función que se rompe es en 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
He zombies, guardia de malloc, y registro de excepciones todo activado, y ninguno de ellos devolver cualquier información útil.
Otros OpenGL Pruebas:
He añadido este fragmento:
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];
a la -windowDidLoad
método de mi NSWindowController
.Se ejecuta sin problema.
He añadido este fragmento:
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];
a otro NSView
's -drawRect
.He recibido el mismo error en CGLGetPixelFormat
.
Radar:
La gente en #macdev parecen creer que este es un sistema operativo problema, y no estoy inclinado a estar en desacuerdo.He presentado un radar (rdar://11980704) explicando el problema y vincular de nuevo a esta pregunta.
Solución:
CGContextRef contextReference = [[NSGraphicsContext currentContext] graphicsPort];
CIContext *coreImageContext = [CIContext contextWithCGContext: contextReference
options: @{kCIContextUseSoftwareRenderer : @YES}];
[coreImageContext drawImage: outputCoreImage
inRect: [self bounds]
fromRect: originalBounds];
Parece forzar la imagen a dibujar usando el software renderer "resuelve" el problema.Es un poco borrosa y lento, pero no se cae.
Solución
Resuelto en 10.8.1
La gente en #macdev parecen creer que este es un sistema operativo problema, y no estoy inclinado a estar en desacuerdo.He presentado un radar (rdar://11980704) explicando el problema y vincular de nuevo a esta pregunta.
Otros consejos
Esta podría ser la primera vez que la aplicación de las llamadas a OpenGL rutina de la que es, probablemente, haciendo que algunos de la primera ejecución de la inicialización o cheques.
Para un experimento, trate de añadir un poco de OpenGL código anterior en la aplicación y a ver si los choques.Trate de pensar acerca de por qué una llamada a OpenGL podría causar un accidente.