2015-10-06 3 views
3

Так что я недавно обновил iOS до 9.0.2. Я использую RosyWriter, пример Apple для захвата и фильтрации видеокадров с использованием CIFilter и CIContext. И он работал большой в прошивке 7 и 8. Это все сломались в прошивке 9.CIContext, iOS 9 и проблемы с памятью

отчета памяти Теперь в RosyWriter и мое приложение выглядит следующим образом: enter image description here

И в конечном итоге приложение падает.

Я вызываю [_ciContext render: toCVPixelBuffer: bounds: colorSpace:]; и изображениеWithCVPixelBuffer. Похоже, что CIContext имеет внутреннюю утечку памяти, когда я называю эти два метода.

Проведя около 4 дней, я обнаружил, что если я создаю новый экземпляр CIContext каждый раз, когда хочу визуализировать буфер и отпускать его после - это уменьшает память. Но это не решение, потому что это слишком дорого.

У кого-либо еще есть эта проблема? Есть ли способ обойти это?

Спасибо.

+0

У вас есть allocatio ns (инструменты), чтобы увидеть, где происходит утечка? – Aggressor

+0

Отсутствие утечек, показанных в Инструментах. – krafter

+0

Как и где вы тестируете? Тесты с использованием конфигурации Release приведут к вводящим в заблуждение результатам. Тесты на симуляторе дадут неверные результаты. – matt

ответ

-1

Krafter,

Вы пишете пользовательские фильтры? Я нахожу, что DOD работает по-разному в iOS 9.

Похоже, если dod.extent.origin.x и dod.extent.origin.y не близки к целым числам, хранящимся в виде двойных чисел (например, 31.0, 333.0) , то размер.выражения выходного изображения будет (dod.extent.size.width + 1.0, dod.extent.size.height + 1.0). До IOS 9.0 значение length.size выходного изображения всегда (dod.extent.size). Итак, если (вы едете на одном и том же изображении через пользовательский CIFilter снова и снова & & ваш dod.extent не близок к красивым, даже целым числам) {вы получаете изображение, размеры которого увеличиваются на 1.0 каждый раз при запуске фильтра, и это может создать такой профиль памяти, как у вас.}

Я предполагаю, что это ошибка в iOS 9, поскольку размер выходного изображения всегда должен соответствовать размеру дод.

Моя установка: IOS v9.2, iPhone 5С и IPad 2, Xcode 7.2, Obj-C

+0

Что делать? И нет, никаких настраиваемых фильтров – krafter

1

Я могу подтвердить, что это утечка памяти все еще существует на прошивке 9.2. (Я также разместил на Apple Developer Forum.)

У меня такая же утечка памяти на iOS 9.2. Я тестировал сброс EAGLContext с помощью MetalKit и MLKDevice. Я тестировал различные методы CIContext, такие как drawImage, createCGImage и рендеринг, но ничего не работает.

Очень ясно, что это ошибка с iOS 9. Попробуйте сами, загрузив пример приложения из Apple (см. Ниже), а затем запустите тот же проект на устройстве с iOS 8.4, затем на устройство с iOS 9.2 и обратите внимание на манометр памяти в Xcode.

Скачать https://developer.apple.com/library/ios/samplecode/AVBasicVideoOutput/Introduction/Intro.html#//apple_ref/doc/uid/DTS40013109

Добавьте к этому APLEAGLView.h: 20

@property (strong, nonatomic) CIContext* ciContext; 

Заменить APLEAGLView.м: 118 с этим

[EAGLContext setCurrentContext:_context]; 
_ciContext = [CIContext contextWithEAGLContext:_context]; 

И, наконец заменить APLEAGLView.m: 341-343 с этим

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

    @autoreleasepool 
    { 
     CIImage* sourceImage = [CIImage imageWithCVPixelBuffer:pixelBuffer]; 
     CIFilter* filter = [CIFilter filterWithName:@"CIGaussianBlur" keysAndValues:kCIInputImageKey, sourceImage, nil]; 
     CIImage* filteredImage = filter.outputImage; 

     [_ciContext render:filteredImage toCVPixelBuffer:pixelBuffer]; 
    } 

    glBindRenderbuffer(GL_RENDERBUFFER, _colorBufferHandle); 
+0

Говорят, что это не утечка, а странное поведение Xcode. Я не уверен в этом, потому что приложения, используемые для сбоя, даже если не в режиме отладки. Сообщество GPUImage, они обсуждают его здесь: https://github.com/BradLarson/GPUImage/issues/2093 – krafter

+0

Хенрик, вы что-то достигли этого? Я также видел ваши комментарии в репозитории SCRecorder на github. Я испытываю ту же проблему и не могу понять ее. – user3344977

+0

No @ user3344977 Я решил свою проблему, создав пользовательский видео-компоновщик. Я не уверен, что это ошибка Xcode, как отметил краптер, но когда я ее протестировал, на самом деле это было так. –

0

Просто используйте ниже код после контекста использования

context = [CIContext contextWithOptions:nil]; 

и освободить объект CGImageRef также

CGImageRelease(<CGImageRef IMAGE OBJECT>); 
+2

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. – SmokeDispenser

Смежные вопросы