我正在使用GPUImage在实时和静态图像上进行一系列图像处理,我注意到在搅拌了~100个缩略图之后,每个图像处理的图像处理都略有不同,但仍有对象在完成处理之后在内存中,它们都与GPUImageFilters相关:
(分配生命周期'已创建且仍然生活')
你可以从我正在做的一些处理中看到内存峰值,在完成之后,在山的另一边我有一些东西留在内存中,我选择了一些24KB的块来检查(还有其他的)。你可以在右边看到,第一个项目来自GPUImageSoftLightBlendFilter,如果我点击所有12个项目,每个项目来自一个GPUImageFilter(GPUImageHardLightBlendFilter,GPUImageMultiplyBlendFilter等)。现在,如果我第二次进行相同的处理,并扩展内存图选择,你将看到没有创建这些对象的新实例,就好像它们占用了内存空间一次并且只是闲逛:
果然,如果我将记忆图选择改为仅显示第二座山,你会发现那些线不会再出现,因为它们并非“创建和放大”。仍然生活'再次:
为什么会这样,我不希望这些GPUImageFilter对象的内存在我的应用程序运行的生命周期中徘徊?我在GPUImageFilters中记录了一些日志以确认它们已被释放并且正在调用dealloc。
答案 0 :(得分:1)
从GPUImage源代码检查看起来,共享GLProgram
保留设置(并保留)上次使用的过滤器中的GPUImageContext
对象,这意味着它对应的OpenGL程序对象也是如此不能消失。但是,现有GLProgram
实现的dealloc仅标记当前要删除的程序。与glDeleteTextures
不同,glDeleteProgram
不绑定当前绑定的程序(如果它是被删除的程序),这意味着它无法完全销毁尚未。因此,您可能需要进行两项更改:
[GPUImageContext setActiveShaderProgram:nil]
以清除当前的GLProgram绑定,该绑定会释放对GLProgram
的最后一个引用,并标记当前要删除的程序。glUseProgram(0)
确保程序未绑定。您可以通过多种方式执行此操作:
EAGLContext
。+[GPUImageContext setActiveShaderProgram:]
正文,可以无条件地在[shaderProgram use]
之上添加,也可以调用[shaderProgram use]
或glUseProgram(0)
,具体取决于shaderProgram
}是nil
。-[GLProgram dealloc]
检查它是否是glGetIntegerv(GL_CURRENT_PROGRAM, &program)
当前绑定的程序,如果是,则取消绑定。