即使在重新分配后,GPUImageFilters中的某些内容仍保留在内存中

时间:2013-04-17 17:15:57

标签: ios objective-c memory-management opengl-es gpuimage

我正在使用GPUImage在实时和静态图像上进行一系列图像处理,我注意到在搅拌了~100个缩略图之后,每个图像处理的图像处理都略有不同,但仍有对象在完成处理之后在内存中,它们都与GPUImageFilters相关:

(分配生命周期'已创建且仍然生活') enter image description here

你可以从我正在做的一些处理中看到内存峰值,在完成之后,在山的另一边我有一些东西留在内存中,我选择了一些24KB的块来检查(还有其他的)。你可以在右边看到,第一个项目来自GPUImageSoftLightBlendFilter,如果我点击所有12个项目,每个项目来自一个GPUImageFilter(GPUImageHardLightBlendFilter,GPUImageMultiplyBlendFilter等)。现在,如果我第二次进行相同的处理,并扩展内存图选择,你将看到没有创建这些对象的新实例,就好像它们占用了内存空间一次并且只是闲逛:

enter image description here

果然,如果我将记忆图选择改为仅显示第二座山,你会发现那些线不会再出现,因为它们并非“创建和放大”。仍然生活'再次:

enter image description here

为什么会这样,我不希望这些GPUImageFilter对象的内存在我的应用程序运行的生命周期中徘徊?我在GPUImageFilters中记录了一些日志以确认它们已被释放并且正在调用dealloc。

1 个答案:

答案 0 :(得分:1)

从GPUImage源代码检查看起来,共享GLProgram保留设置(并保留)上次使用的过滤器中的GPUImageContext对象,这意味着它对应的OpenGL程序对象也是如此不能消失。但是,现有GLProgram实现的dealloc仅标记当前要删除的程序。与glDeleteTextures不同,glDeleteProgram不绑定当前绑定的程序(如果它是被删除的程序),这意味着它无法完全销毁尚未。因此,您可能需要进行两项更改:

  1. 调用[GPUImageContext setActiveShaderProgram:nil]以清除当前的GLProgram绑定,该绑定会释放对GLProgram的最后一个引用,并标记当前要删除的程序。
  2. 通过调用glUseProgram(0)确保程序未绑定。您可以通过多种方式执行此操作:
    • 在上面的调用之后立即显式调用它,因为已经绑定了正确的EAGLContext
    • 将调用添加到+[GPUImageContext setActiveShaderProgram:]正文,可以无条件地在[shaderProgram use]之上添加,也可以调用[shaderProgram use]glUseProgram(0),具体取决于shaderProgram }是nil
    • -[GLProgram dealloc]检查它是否是glGetIntegerv(GL_CURRENT_PROGRAM, &program)当前绑定的程序,如果是,则取消绑定。