2

ドキュメントからCIContext drawImage:inRect:fromRect:

.. iOS 6 では、このメソッドは非同期です..

そのため、 CADisplayLinkで使用すると、実際の描画が追いつかない間に 60fps で非同期描画を開始し続けるため、問題が発生します。

- (void) displayLinkDidFire:(CADisplayLink *)displatLink;
{
    CFTimeInterval duration = [displatLink duration];
    CGFloat fps = round (1.0 / duration);
    NSLog(@"%f fps", fps); // Always logs 60 fps since drawImage is async

    // This method is fast since a CIImage is just a 'recipe' for an image
    CIImage * result = [Helper generateCIImage];

    // This drawing is unable to keep up with the calls to the displayLinkDidFire method
    [self.ciContext drawImage:result
                       inRect:self.destFrame
                     fromRect:self.targetFrame];
}

この問題を回避するにはどうすればよいですか?


編集 - 詳細情報

EAGLContext(WWDC に従って描画パフォーマンスを向上させるため) でCoreImage を使用しています。

self.eaglContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

self.ciContext = [CIContext
                  contextWithEAGLContext:self.eaglContext
                  options: @{kCIContextWorkingColorSpace:[NSNull null]} ];

GLKView *view = (GLKView *)self.view;
view.context = self.eaglContext;
view.drawableDepthFormat = GLKViewDrawableDepthFormat24;

NSURL * testImageURL = [[NSBundle mainBundle] URLForResource:@"image" withExtension:@"jpg"];
NSAssert(nil != testImageURL, @"Image not found");

self.image = [CIImage imageWithContentsOfURL:testImageURL
                                     options:@{ kCIImageColorSpace:[NSNull null] }];

[EAGLContext setCurrentContext:self.eaglContext];

self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkDidFire:)];

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

1 に答える 1