附加 OpenGL Profiler 时 GPUImageView 挂在 presentFrameBuffer 上
GPUImageView hanging on presentFrameBuffer when OpenGL Profiler attached
我已经在 GPUImage
github 页面上提交了一个问题,但我想看看这里是否有人有解决方法或对问题原因有更好的了解。
我有一个 GPUImageView
由 GPUImageRawDataInput
在 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
作为其层。更改之后,我可以使用探查器进行跟踪而无需挂起。
我已经在 GPUImage
github 页面上提交了一个问题,但我想看看这里是否有人有解决方法或对问题原因有更好的了解。
我有一个 GPUImageView
由 GPUImageRawDataInput
在 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
作为其层。更改之后,我可以使用探查器进行跟踪而无需挂起。