附加 OpenGL Profiler 时 GPUImageView 挂在 presentFrameBuffer 上

GPUImageView hanging on presentFrameBuffer when OpenGL Profiler attached

我已经在 GPUImage github 页面上提交了一个问题,但我想看看这里是否有人有解决方法或对问题原因有更好的了解。

我有一个 GPUImageViewGPUImageRawDataInput 在 OS X 应用程序中提供。如果我附加 OpenGL Profiler 并在更新时打开跟踪,处理会卡在 [NSOpenGLContext flushBuffer] 中(特别是在 __psynch_mutexwait 中)。对于一个简单的测试用例,我只有一个带有按钮的视图控制器和 class GPUImageView 的自定义视图以及控制器中的以下代码:

-(void)awakeFromNib{
    [super awakeFromNib];
    NSString *fname = [[NSBundle mainBundle] pathForResource:@"TestImage" ofType:@"dat"];
    NSError *err = nil;
    if(!fname){
        err = [NSError errorWithDomain:@"ViewController" code:0
                              userInfo:@{NSLocalizedFailureReasonErrorKey:@"No selected data file!"}];
    }else{
        _rawDataFromFile = [NSData dataWithContentsOfFile:fname
                                                  options:NSDataReadingMappedIfSafe | NSDataReadingUncached
                                                    error:&err];
    }
    if(err){
        [self presentError:err];
        return;
    }
    [self.imageView setFillMode:kGPUImageFillModePreserveAspectRatio];
    [self.imageView setBackgroundColorRed:0.0 green:0.0 blue:0.0 alpha:1.0];
    GLubyte* data = (GLubyte *)[self.rawDataFromFile bytes];
    _inputFilter = [[GPUImageRawDataInput alloc] initWithBytes:data
                                                          size:CGSizeMake(1024, 241)
                                                   pixelFormat:GPUPixelFormatLuminance
                                                          type:GPUPixelTypeUByte];
    [self.inputFilter addTarget:self.imageView];
}

- (IBAction)updateAction:(id)sender {
    if (_inputFilter) {
        [self.inputFilter useNextFrameForImageCapture];
        [self.inputFilter processData];
    }
}

关于为什么这可能会挂起的任何想法 只有当附加分析器时 ?谢谢!

我 运行 使用 2012 年中期的 macbook pro,OS X 10.11.4。

我刚刚发现 "simple" 测试用例中的一个错误解决了我的问题。它指出了人们在 OS X 应用程序中使用 GPUImage 可能遇到的其他问题的潜在解决方案,因此我将其作为解决方案发布在此处。

如果您使用 Interface Builder 将 GPUImageView 放在 NSView 中,请确保关闭父视图的 Core Animation Layer,除非您明确需要它并且知道自己在做什么(默认情况下打开)。

我只是 运行 解决了这个问题 — 不是使用 GPUImage,而是尝试使用 OpenGL Profiler 跟踪我的应用程序。我的解决方案是从使用 NSOpenGLView 的子类切换到使用 NSView 的子类并将 NSOpenGLLayer 作为其层。更改之后,我可以使用探查器进行跟踪而无需挂起。