Не удается нарисовать CIImage на GLKView после нескольких кадров после обновления до iOS 10.2?

Используя следующий код в моем приложении, которое выполняло тихий штраф, чтобы снова и снова рисовать CIImage на GLKView, как получено из AVCaptureOutput -didOutputSampleBuffer пока я не использовал iOS <= 10.1.*

После обновления устройства до iOS 10.2.1 оно перестало работать. Я называю это для нескольких кадров, приложение просто падает с предупреждением о нехватке памяти. В то время как с iOS 10.1.1 и ниже я без проблем запускаю приложение даже на старых устройствах, таких как iPhone 5S.

[_glkView bindDrawable];  

if (self.eaglContext != [EAGLContext currentContext])  
[EAGLContext setCurrentContext:self.eaglContext];  

glClearColor(0.0, 0.0, 0.0, 1.0);  
glClear(GL_COLOR_BUFFER_BIT);  

glEnable(GL_BLEND);  
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);  

if (ciImage) {  
    [_ciContext drawImage:ciImage inRect:gvRect fromRect:dRect];  
}  

[_glkView display];  

Вот как я делаю CIImage.

- (CIImage*)ciImageFromPixelBuffer:(CVPixelBufferRef)pixelBuffer ofSampleBuffer:(CMSampleBufferRef)sampleBuffer {
CIImage *croppedImage           = nil;

CFDictionaryRef attachments     = CMCopyDictionaryOfAttachments(kCFAllocatorDefault, sampleBuffer, kCMAttachmentMode_ShouldPropagate);
CIImage *ciImage                = [CIImage imageWithCVPixelBuffer:pixelBuffer options:(NSDictionary *)attachments];

if (attachments)
    CFRelease(attachments);

croppedImage = ciImage;


    CIFilter *scaleFilter = [CIFilter filterWithName:@"CILanczosScaleTransform"];
    [scaleFilter setValue:croppedImage forKey:@"inputImage"];
    [scaleFilter setValue:[NSNumber numberWithFloat:self.zoom_Resize_Factor == 1 ? 0.25 : 0.5] forKey:@"inputScale"];
    [scaleFilter setValue:[NSNumber numberWithFloat:1.0] forKey:@"inputAspectRatio"];
    croppedImage = [scaleFilter valueForKey:@"outputImage"];


    NSDictionary *options = @{(id)kCIImageAutoAdjustRedEye : @(false)};

    NSArray *adjustments = [ciImage autoAdjustmentFiltersWithOptions:options];
    for (CIFilter *filter in adjustments) {
        [filter setValue:croppedImage forKey:kCIInputImageKey];
        croppedImage = filter.outputImage;
    }

CIFilter *selectedFilter = [VideoFilterFactory getFilterWithType:self.selectedFilterType]; //This line needs to be removed from here

croppedImage = [VideoFilterFactory applyFilter:selectedFilter OnImage:croppedImage];

CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);

return croppedImage;
}

Вот imgur ссылка https://imgur.com/a/u6Vyo результатов инструментов VM Tracker и OpenGL ES. Если это легко понять. Благодарю.

1 ответ

Решение

Ваша реализация рендеринга GLKView выглядит хорошо, проблема, похоже, связана с объемом обработки, которую вы выполняете в PixelBuffer после преобразования его в CIImage.

Также ссылка Imgur, которой вы поделились, показывает, что GLKView не может правильно подготовить объект VideoTexture, скорее всего, из-за перегрузки памяти, создаваемой в каждой итерации. Вам необходимо оптимизировать этот CIFilter Processing.

Другие вопросы по тегам