Вопрос

Итак, у меня есть 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 на этой линии.Если я поднимусь по стеку, я обнаружу, что внутренний вызов функции, который вызывает прерывание, включен. 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's -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];

Похоже, что принудительная отрисовка изображения с помощью программного средства рендеринга «решает» проблему.Немного размыто и медленно, но не вылетает.

Это было полезно?

Решение

Решено в 10.8.1

Ребята из #macdev, похоже, считают, что это проблема ОС, и я не склонен с этим не согласиться.Я отправил радар (rdar://11980704), объясняя проблему и давая ссылку на этот вопрос.

Другие советы

Это может быть первый раз, когда ваше приложение вызывает какую-либо подпрограмму OpenGL, которая, вероятно, выполняет некоторую инициализацию или проверку при первом запуске.

В качестве эксперимента попробуйте добавить немного кода OpenGL ранее в свое приложение и посмотрите, не произойдет ли сбой.Попробуйте подумать, почему вызов OpenGL может привести к сбою.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top