From the docs on CIContext drawImage:inRect:fromRect: :
.. On iOS 6, this method is asynchronous ..
所以如果我在 CADisplayLink 中使用它它遇到了一个问题,因为它将继续以 60fps 的速度触发异步绘图,而实际绘图可能无法跟上。
- (void) displayLinkDidFireCADisplayLink *)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 的 CoreImage(根据 WWDC 以获得更好的绘图性能)。
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 selectorselector(displayLinkDidFire];
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
Best Answer-推荐答案 strong>
解决方案是使用“OpenGL ES 渲染循环”,而不是尝试使用 CADisplayLink 构建一个。幸运的是,这很容易,因为 GLKViewController 自动执行此操作:
The GLKViewController class provides all of the standard view controller functionality, but additionally implements an OpenGL ES rendering loop.
唯一的缺点是这将您与使用 GLKViewController 紧密联系在一起,而不是仅仅将 GLKView 添加到现有的 UIView。要解决这个问题,您需要弄清楚如何实现自己的 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];
}
关于ios - CIContext如何使用drawImage :inRect:fromRect: with a CADisplayLink,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/17898890/
|