سؤال

لذلك، لدي CIImage التي أحاول رسمها NSView-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

لقد قمت بتشغيل استثناءات الزومبي وguard 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];

يبدو أن إجبار الصورة على الرسم باستخدام عارض البرنامج "يحل" المشكلة.إنها ضبابية وبطيئة بعض الشيء، لكنها لا تتعطل.

هل كانت مفيدة؟

المحلول

تم الحل في 10.8.1

يبدو أن الأشخاص في #macdev يعتقدون أن هذا يتعلق بمشكلة في نظام التشغيل، وأنا لا أميل إلى الاختلاف.لقد قمت بتقديم رادار (rdar://11980704) يشرح المشكلة ويربطها بهذا السؤال.

نصائح أخرى

قد تكون هذه هي المرة الأولى التي يتصل فيها تطبيقك بأي روتين OpenGL والذي من المحتمل أن يقوم ببعض عمليات التهيئة أو الفحوصات التي يتم تشغيلها لأول مرة.

لإجراء تجربة، حاول إضافة رمز OpenGL صغير في وقت سابق إلى تطبيقك ومعرفة ما إذا كان ذلك سيتعطل أيضًا.حاول أن تفكر في سبب تسبب الاتصال بـ OpenGL في حدوث عطل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top