调整GLKView的大小

6
当调整GLKView的大小时,会在该GLKView的缓冲区和上下文中进行一些幕后操作。在执行这些幕后操作的时间内,对GLKView的绘制不会产生正确的结果。
在我的情况下,我有一个启用了setNeedsDisplayGLKView,因此每当我需要更新其屏幕内容时,我只需在该GLKView上调用-setNeedsDisplay。我正在使用GLKView来绘制图像,因此如果我需要绘制具有不同大小的图像,则还需要更改GLKView的大小。
问题在于:当我改变GLKView的大小并在该视图上调用setNeedsDisplay时,屏幕上的结果不正确。这是因为GLKView在尝试绘制新图像之前尚未完成由新大小更改引发的幕后操作。
我通过调用performSelector:@selector(setNeedsDisplay) withObject:nil afterDelay:0而非仅在GLKView上调用setNeedsDisplay来解决了这个问题。这基本上迫使主线程等待所有幕后的OpenGL操作完成后才调用setNeedsDisplay。虽然这样可以正常工作,但我想知道是否有更好的解决方案。例如,是否有一个OpenGL调用可以使线程等待所有OpenGL操作完成后再继续?
1个回答

9
解决方案是在GLKView调整大小后重置CIContext对象。

你是如何重置它的?重新创建它吗?还是有特定的方法可以调用。 - flainez
1
在我的情况下,调整大小后,我设置了我的 CIContext 对象,如下所示:ci_context = [CIContext contextWithEAGLContext:glkView.context],然后调用 [glkView display]。请注意,这是很久以前的事情,我没有继续学习它,所以不要认为这是正确的方法。 - spybart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接