【发布时间】:2014-04-02 07:14:08
【问题描述】:
我很难找到任何关于如何正确使用 Core Image 和 GLKView 的示例,以便平滑地呈现 Core Image “食谱”以响应用户输入。所以,在阅读了Core Image Programming Guide 和GLKView class reference 之后,我想出了一个可行的方法。但是,我不确定它是否有效,所以我希望有人可以确认它没问题,或者为我指出一个更好的方向。
现在,我正在使用 GLKView 和 GLKViewController。 GLKView 将绘图委托给它的父视图控制器,它实现了glkView:drawInRect:。绘图方法是这样做的:
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
// make glkView's background light gray instead of black
glClearColor(backgroundRGB, backgroundRGB, backgroundRGB, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// a custom object that holds a reference to a CIContext
ImageEditingContext* context = [ImageEditingContext getInstance];
// apply a core image recipe
CIImage *outputImage = [context getFilteredPreviewCIImage];
// draw the image
CGRect inRect = outputImage.extent;
inRect.origin.y = (self.glkView.contentScaleFactor * self.glkView.frame.size.height - inRect.size.height) / 2.0;
[context.coreImageContext drawImage:outputImage inRect:inRect fromRect:outputImage.extent];
}
具体来说,我关心的是最后一行[context.coreImageContext drawImage:outputImage inRect:inRect fromRect:outputImage.extent]。从glkView:drawInRect: 中调用该方法是否有效?正如我之前提到的,这种方法似乎工作正常,但在运行 OpenGL ES Analysis Instruments 模板后我开始怀疑它。它用这个问题标记了这条线:
Multi-context Renderbuffer Usage without Flush: Renderbuffer #2 - 您的应用程序使用了一个已在不同上下文中更新的渲染缓冲区对象,而没有后续的刷新操作。
我的GLKView 和CIContext 都设置了相同的EAGLContext,所以我不太确定错误消息指的是什么。非常感谢任何见解!
【问题讨论】:
-
据我所知,您的代码已尽其所能。正如您所指出的,您正在从您的视图绘制的同一 GL 上下文创建 CI 上下文,并且该警告特别与在另一个上下文中采取的操作有关。我的猜测是 CI 正在创建自己的私有 GL 上下文(使用与您传入的上下文相同的共享组),在那里完成所有工作,完成后不会刷新。 (Ewww.)Filing a bug 可能是个好主意。
-
感谢您的观看,@rickster!我会继续提交错误。
-
@gilby 你有没有弄清楚哪里出了问题。对于几乎相同的代码,我遇到了同样的问题。
-
@otusweb 我没有,但我已经切换到 Metal,它更快!
标签: ios objective-c opengl-es core-image glkview