2013-07-27 2 views
1

From the docs on CIContext drawImage:inRect:fromRect:로 : 그래서,이 방법은 비동기 아이폰 OS 6 일 CIContext의 drawImage를 사용하는 방법 : inRect : fromRect을하십시오 CADisplayLink

.. ..

나는 그것을 사용하고있는 경우 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]; 
} 

이 문제를 해결하려면 어떻게합니까?


편집 - 내가 (WWDCs에 따라 더 나은 그리기 성능)을 EAGLContext로 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); 
+0

일반적으로 디스플레이 링크는 필요한 것을 수행 한 다음보기를 새로 고치도록 'setNeedsDisplay'를 호출합니다. 이로 인해 비동기식 타이밍 문제가 발생하지는 않습니다. – Rob

+0

@Rob 디스플레이 링크가'-setNeedsDisplay'를 호출하지 않는다고 생각합니다. 이것은 표준'-drawRect :'뷰 갱신주기와 독립적으로 작동합니다. –

+0

@Rob - 의견을 보내 주셔서 감사합니다. displayLink가 60fps에서 실행되는 반면 내 장치에서는 약 0.5fps의 표시가 나타납니다. 따라서 비동기가 문제라고 생각했습니다. drawImage가 비동기이거나 'CADisplayLink'이외의 다른 것을 드로잉을 트리거하는 데 사용해야하는 것은 중요하지 않다는 말입니까? – Robert

답변

1

solutuion 대신 CADisplayLink 하나를 구축을 위해 노력하는 "는 OpenGL ES 렌더링 루프"를 사용하는 것이 었습니다.

GLKViewController 클래스는 표준보기 컨트롤러의 모든 기능을 제공하지만 추가는 OpenGL ES 렌더링 루프를 구현하십시오 GLKViewController이 automtically을 수행하기 때문에 다행히이 쉬웠다.

유일한 아래쪽

이이 강하게 단지 기존의 UIView에 GLKView를 추가하는 대신 GLKViewController를 사용하여 당신을 묶어 것입니다. 이 문제를 해결하려면 OpenGL ES 렌더링 루프를 구현하는 방법을 알아야합니다.

// The GLKViewController automatically calls this method 
- (void) updateScreen 
{   
    CIImage * result = [Helper generateCoreImage]; 

    // Clears the screen to a grey color 
    glClearColor(0.5, 0.5, 0.5, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT); 

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

    [self.ciContext drawImage:result 
         inRect:self.destFrame 
        fromRect:self.targetFrame]; 

    // `display` needs to be called here according to the docs. 
    GLKView *view = (GLKView *)self.view; 
    [view display]; 
}