Я пытаюсь сделать действительно базовое демонстрационное приложение, которое позволяет пользователю выбирать изображение и режим наложения, а затем перетаскивать и манипулировать смешанным изображением поверх фонового изображения. Когда пользователь перетаскивает верхнюю часть изображения фона, мне нужна производительность в реальном времени (20 + fps на 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];
Спектакль я получаю не то, что я ожидал, я ожидал 60fps, так как это такая простая сцена, но на мой IPad 4 я получаю ~ 35 или так, и я уверен, что это будет хуже на iPhone 4, который является моим самым низким общим знаменателем.
Да, я установил его на 60 – FreaknBigPanda
Является ли GLKView, связанный с GLKViewController, также настроенным с EAGLContext, который вы инициализируете в своем установочном коде? (Обычно вы можете сделать CIContext из параметра контекста GLKView ->.) – 32Beat
Да, я просто сделал еще несколько тестов и на iPhone 4 я получаю <5 кадров в секунду. Сейчас я думаю, что основной образ каким-то образом добавляет массу накладных расходов. Я знаю, что если бы я отказался от прямого использования OpenGL, я бы быстро стал работать в режиме реального времени. – FreaknBigPanda