2013-04-17 2 views
2

Я использую GPUImage, чтобы выполнить кучу обработки изображений как в реальном времени, так и на статических изображениях, я заметил, что после вспенивания через ~ 100 миниатюр, каждое из которых имеет несколько другое изображение обработка делается для каждого, что есть еще объекты в памяти после того, как они сделали обработку, и все они связаны с GPUImageFilters:Что-то из GPUImageFilters остается в памяти даже после освобождения

(Allocation продолжительностью жизни «созданной & все еще живет») enter image description here

You может видеть всплеск памяти из некоторой обработки, которую я делаю, и afte r его сделано, с другой стороны горы у меня есть кое-что оставленное в памяти, я выбрал некоторые 24KB блоки для изучения (есть другие). Вы можете видеть справа, первый элемент происходит от GPUImageSoftLightBlendFilter, если я нажимаю на все 12 элементов, каждый из которых поступает из GPUImageFilter (GPUImageHardLightBlendFilter, GPUImageMultiplyBlendFilter и т. Д.). Теперь, если я сделаю такую ​​же обработку во второй раз и развернуту выбор графа памяти, вы не увидите никаких новых экземпляров этих объектов, как если бы они занимали место в памяти один раз и просто зависали:

enter image description here

Конечно, если бы я изменить выбор графа памяти, чтобы показывать только вторую гору, которую вы видите, что те линии не появляются снова, потому что они не были «созданы & все еще живет» снова:

enter image description here

Почему это, я не хочу, чтобы память из этих объектов GPUImageFilter, висящих на протяжении всего моего приложения? Я ввел некоторые записи в GPUImageFilters, чтобы подтвердить, что они освобождены, и вызывается dealloc.

+1

Возможно, это связано с управлением памятью в сочетании с графическим процессором? Возможно, структура OpenGL ES никогда не выпускается должным образом. – kev

ответ

1

С кодом осмотра источника GPUImage, это выглядит как GLProgram объект от последнего используемого фильтра остается установленным (и сохраняется) разделяемым GPUImageContext, что означает, что соответствующая программа OpenGL объекты также не может уйти. Однако dealloc для существующей реализации GLProgram отмечает только текущую программу для удаления. В отличие от 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), и отключайте себя, если она есть.
+0

Ницца, взволнован, чтобы попробовать это, но я не могу найти ссылки на «GPUImageContext», вы имели в виду «GPUImageOpenGLESContext»? – Shizam

+1

Hokay, я запустил '[GPUImageOpenGLESContext setActiveShaderProgram: nil]' и 'glUseProgram (0)' в dealloc ViewController, который настраивает эти GPUImageFilters, но не повлиял на остаточную память GLEngine. Dang. – Shizam