CIImage drawing EXC_BAD_ACCESS
-
12-12-2019 - |
質問
だから、私は持っている CIImage
私はで描画しようとしていること NSView
'sの -drawRect
メソッド。
これは、画像を描画するために呼び出すコード行です:
[outputCoreImage drawInRect: [self bounds]
fromRect: originalBounds
operation: NSCompositeSourceOver
fraction: 1];
outputCoreImage
, originalBounds
, 、および [self bounds]
すべて非です-nil
, 、そして実際にはそれぞれの期待値です。Lion(OS X10.7)では、これは正常に機能しましたが、Mountain Lion(OS X10.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の人々は、これがOSの問題にあると信じているようで、私は反対する傾向はありません。問題を説明し、この質問にリンクするレーダー(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の人々は、これがOSの問題にあると信じているようで、私は反対する傾向はありません。問題を説明し、この質問にリンクするレーダー(rdar://11980704)を提出しました。
他のヒント
これは、おそらく最初に実行される初期化またはチェックを実行しているOpenGLルーチンをアプリが呼び出すのは初めてかもしれません。
実験のために、あなたのアプリの前に少しOpenGLコードを追加してみて、それがクラッシュするかどうかを確認してください。OpenGLを呼び出すとクラッシュが発生する理由を考えてみてください。