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);
일반적으로 디스플레이 링크는 필요한 것을 수행 한 다음보기를 새로 고치도록 'setNeedsDisplay'를 호출합니다. 이로 인해 비동기식 타이밍 문제가 발생하지는 않습니다. – Rob
@Rob 디스플레이 링크가'-setNeedsDisplay'를 호출하지 않는다고 생각합니다. 이것은 표준'-drawRect :'뷰 갱신주기와 독립적으로 작동합니다. –
@Rob - 의견을 보내 주셔서 감사합니다. displayLink가 60fps에서 실행되는 반면 내 장치에서는 약 0.5fps의 표시가 나타납니다. 따라서 비동기가 문제라고 생각했습니다. drawImage가 비동기이거나 'CADisplayLink'이외의 다른 것을 드로잉을 트리거하는 데 사용해야하는 것은 중요하지 않다는 말입니까? – Robert