2016-05-21 5 views
0

Я представил вопрос на странице gittub GPUImage, но думал, что увижу, есть ли у кого-нибудь здесь обходной путь или лучшее представление о причине проблемы.GPUImageView висит на presentFrameBuffer при подключении OpenGL Profiler

У меня есть GPUImageView, поданный GPUImageRawDataInput в приложении OS X. Если я присоединяю OpenGL Profiler и включаю трассировку во время обновления, обработка застревает в [NSOpenGLContext flushBuffer] (в частности, в __psynch_mutexwait). Для простого теста, у меня только есть контроллер представления с кнопкой и настраиваемым представлением класса 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.

ответ

1

Я только что осознал ошибку в моем «простом» тестовом примере, который решает мою проблему. Он указывает на потенциальное решение других проблем, которые могут возникнуть у людей с GPUImage в приложениях OS X, поэтому я размещаю его как решение здесь.

Если вы используете Interface Builder, чтобы разместить ваш GPUImageView внутри NSView, убедитесь, что вы включите родительский вид Core Animation Layer-х выключен, если явно не нужно и знать, что вы делаете (это по умолчанию).

0

Я просто столкнулся с этой проблемой, а не с GPUImage, но просто пытался отслеживать свое приложение с помощью OpenGL Profiler. Моим решением было перейти от использования подкласса NSOpenGLView к использованию подкласса NSView с NSOpenGLLayer в качестве его слоя. После этого изменения я могу проследить с профилировщиком без зависания.