我们正在使用iOS OpenGL / GPUImage预览屏幕中的某些类型的applicationDidBecomeActive和DidEnterBackground发生崩溃。具体来说,只有在按下/释放电源按钮以使应用程序背景时才会发生。如果单击主页按钮并将应用程序发送到后台并重新激活,则不会发生这种情况。我们没有在后台调用任何OpenGL [已阅读Apple DO和DONT] - 应用程序在BG中没有做任何事情并试图在DidResign本身停止。
只有当设备传感器有一个新的视频捕获帧时才会进行GPU调用,我认为当它进入后台时,它会被iOS暂停。因此,下面的堆栈跟踪只能在应用程序重新启动时或在正式暂停之前触发???
当应用程序进入bg并重新激活时,是否有人知道需要遵循的任何Apple或其他iOS / OpenGL分配/发布协议?更重要的是,是否有一种干净的方法来清除/释放所有OpenGL / GPUImage帧缓冲区/纹理/上下文等,并重新初始化所有内容?
部分堆栈跟踪如下所示,它与EXC_BAD_ACCESS崩溃:
#6 0x003635fe in -[GPUImageContext presentBufferForDisplay] at
#7 0x0035c416 in -[GPUImageView presentFramebuffer] at
#8 0x0035cb4a in __44-[GPUImageView newFrameReadyAtTime:atIndex:]_block_invoke at
#9 0x00363d9e in runSynchronouslyOnVideoProcessingQueue at
#10 0x0035c89e in -[GPUImageView newFrameReadyAtTime:atIndex:] at
#11 0x00357a12 in -[GPUImageFilter informTargetsAboutNewFrameAtTime:] at
答案 0 :(得分:1)
不确定我是否遇到了同样的问题,但是当应用程序放在后台时,我确实收到EXC_BAD_ACCESS
错误。
当应用程序进入后台时,我可以通过暂停(并恢复)视频预览来解决此问题。
绑定应用程序,以便在GPUImageVideoCamera startCameraCapture
之后通知您后台/前台活动:
- (void)addObservers {
[[NSNotificationCenter defaultCenter]addObserver:self
selector:@selector(applicationDidEnterBackground:)
name:UIApplicationDidEnterBackgroundNotification
object:nil];
[[NSNotificationCenter defaultCenter]addObserver:self
selector:@selector(applicationDidBecomeActive:)
name:UIApplicationDidBecomeActiveNotification
object:nil];
}
使用GPUImageVideoCamera stopCameraCapture
并使用dealloc
方法停止相机后添加这些内容:
- (void)removeObservers {
[[NSNotificationCenter defaultCenter]removeObserver:self
name:UIApplicationDidEnterBackgroundNotification
object:nil];
[[NSNotificationCenter defaultCenter]removeObserver:self
name:UIApplicationDidBecomeActiveNotification
object:nil];
}
并使用这些回调进行状态更改(我不确定这些方法名称是否存在任何名称空间冲突,尽管我还没有):
- (void)applicationDidBecomeActive:(NSNotification *)notification {
[self.videoCamera resumeCameraCapture];
}
- (void)applicationDidEnterBackground:(NSNotification *)notification {
// TODO: Stop recording if recording in progress
[self.videoCamera pauseCameraCapture];
}
答案 1 :(得分:0)
我在照片处理应用程序中遇到类似的问题,它使用开放式着色器来完成它。
可能是在进入后台并返回时,OpenGL着色器程序不再存在。
返回时假设需要重新编译着色器程序。查看gpuimage示例,我不确定是否有一种简单的方法可以告诉每个着色器程序不再编译。
您可能希望将其报告为Brad Larson's github上的错误。或者您可以尝试返回前景销毁并重建所有目标/过滤器。
我现在也看到这个问题已经有几个月了,你现在可能已经找到了解决方案。如果您能够回答自己的问题以帮助SO社区,那就太好了。