Производительность в реальном времени с основными режимами смешивания изображений

Я пытаюсь создать действительно простое демонстрационное приложение, которое позволяет пользователю выбирать изображение и режим наложения, а затем перетаскивать и манипулировать смешанным изображением поверх фонового изображения. Когда пользователь перетаскивает изображение поверх фона, мне нужна производительность в реальном времени (20+ кадров в секунду на iPhone 4). Изображения имеют то же разрешение, что и экран.

Можно ли это сделать с базовым образом? Я пробовал пару разных подходов, но я не могу добиться желаемой производительности.

Прямо сейчас я делаю что-то вроде этого:

CIFilter * overlayBlendMode = [CIFilter filterWithName:@"CIOverlayBlendMode"];
[overlayBlendMode setValue:self.foregroundImage forKey:@"inputImage"];
[overlayBlendMode setValue:self.backgroundImage forKey:@"inputBackgroundImage"];

CIImage * test = [overlayBlendMode outputImage];

// render background image
[self.ciContext drawImage:test inRect:test.extent fromRect:test.extent];

Этот код выполняется каждый раз, когда вызывается отображение из моего GLKViewController.

И мой установочный код:

self.glContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
self.ciContext = [CIContext contextWithEAGLContext:self.glContext];

...

UIImage * foregroundImage = [ViewController imageScaledFromImage:[UIImage imageNamed:@"Smiley"] inRect:CGRectMake(0, 0, 100, 100)];
GLKTextureInfo * foregroundTexture = [GLKTextureLoader textureWithCGImage:foregroundImage.CGImage options:@{GLKTextureLoaderOriginBottomLeft: @(YES)} error:nil];
self.foregroundImage = [CIImage imageWithTexture:foregroundTexture.name size:foregroundImage.size flipped:NO colorSpace:nil];

UIImage *backgroundImage = [ViewController imageCenterScaledFromImage:[UIImage imageNamed:@"Kate.jpg"] inRect:(CGRect){0,0,self.renderBufferSize}];
GLKTextureInfo * backgroundTexture = [GLKTextureLoader textureWithCGImage:backgroundImage.CGImage options:@{GLKTextureLoaderOriginBottomLeft: @(YES)} error:nil];
self.backgroundImage = [CIImage imageWithTexture:backgroundTexture.name size:backgroundImage.size flipped:NO colorSpace:nil];

Производительность, которую я получаю, не та, которую я ожидал, я ожидал 60 кадров в секунду, поскольку это такая простая сцена, но на моем iPad 4 я получаю ~35 или около того, и я уверен, что это будет хуже на iPhone 4, который мой самый низкий общий знаменатель.

1 ответ

Вы установили GLKViewController -> предпочитаемое значение FramesPerSecond в значение, отличное от значения по умолчанию 30?

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