我在链中使用GPUImageFilter,大部分时间它都可以正常工作。我最近遇到了一些与此github issue中的症状相匹配的随机崩溃(尽管我使用的是GPUImageFilter而不是实时捕获或视频)。我正在尝试找到一种合适的方法,可以确保我在willResignActive
中清除了帧缓冲区和任何其他与GPUImage相关的活动。
目前我有:
[[GPUImageContext sharedFramebufferCache] purgeAllUnassignedFramebuffers];
这还够吗?我应该使用别的东西吗?
答案 0 :(得分:1)
如上所示,在堆栈跟踪中看到gpus_ReturnNotPermittedKillClient
几乎总是由于在您的应用程序处于后台或即将进入后台时执行OpenGL ES操作。
要处理此问题,您需要保证在应用程序前往后台之前完成所有与GPUImage相关的工作。您将要监听应用程序前往后台的委托通知,并确保在该委托回调退出之前完成所有处理。 henryl的建议是确保这一点的一种方法。在委托回调结束时添加以下内容:
runSynchronouslyOnVideoProcessingQueue(^{
// Do some operation
});
这样做会将同步块注入视频处理管道(在后台队列上运行)。您的委托回调将阻止该主线程,直到该块有机会执行,保证所有处理块在它完成之前。这将确保所有待处理的操作都已完成(假设您没有添加新操作),然后才能将应用程序移至后台。
在您的应用程序中引入死锁的可能性很小,但我不认为处理管道中的任何代码都会回调到主队列中。您可能需要注意这一点,因为如果我仍然有一些东西可以做到这一点,这将锁定您的应用程序。如果是这样,那么内部代码就需要修复。