我的presentRenderBuffer调用看起来是随机的(但在任何给定的程序运行期间通常都是一致的),它非常慢。我追踪到了presentRenderBuffer对glFlush()的调用,所以现在我在presentRenderBuffer之前调用了glFlush()。我在glFlush()上设置了一个定时器,它会做两件事中的一件,看起来是随机的。
glFlush()也可以
1)持续耗时0.0003秒
或
2)在大约0.019秒和0.030秒之间交替
最奇怪的是,这是独立于绘图代码的。即使我注释掉了所有的绘图代码,它所做的就是调用glClear(),我仍然只是随机地得到两个结果中的一个。
绘图方法由具有以下设置的CADisplayLink调用:
dLink = [[UIScreen mainScreen] displayLinkWithTarget:viewController selector:@selector(drawFrame)];
dLink.frameInterval = 1;
[dLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];我发现不可能确定是什么导致了其中一个结果的发生。有谁能提供点子吗?
发布于 2011-08-18 01:25:39
由于设备使用的是基于磁贴的延迟渲染器,因此在iOS OpenGL ES调用上执行精确的计时通常有点棘手。状态更改、绘制和其他操作可以推迟到场景显示之前。
这通常会使glFlush()或上下文的-presentRenderBuffer:看起来非常慢,而实际上它只是导致所有的延迟呈现在那个点上执行。
在这种情况下,您注释掉了所有绘图代码,但glClear()不受此影响。您在交替示例中呈现的不同计时大致相当于1/53或1/33秒,这似乎表明它可能只是阻塞了足够长的时间来匹配屏幕刷新率。CADisplayLink应该会让你与屏幕刷新保持同步,但我可以看到你的绘图有时会稍微偏离。
你是在主线程上运行这个测试吗?可能有什么东西引起了主线程的轻微阻塞,使您稍微偏离了屏幕刷新时间。当我将渲染转移到后台线程时,我已经看到了这种振荡的减少,但它仍然由CADisplayLink触发。当我这样做的时候,渲染速度也提高了,特别是在多核iPad 2上。
最后,我不认为在iOS上使用OpenGL ES时需要显式使用glFlush()。EAGLContext的presentRenderbuffer:方法应该就是将帧渲染到屏幕上所需的全部方法。在这里,我没有在我的OpenGL ES应用程序中看到任何glFlush()实例。在您的情况下,它可能是多余的。
发布于 2011-08-22 16:06:19
我找到了我认为的问题所在。附加到EAGLView的视图控制器未设置为窗口的根视图控制器。相反,视图被手动添加为窗口的子视图。当这个问题得到纠正(以及其他几个相关的修复)时,drawFrame方法现在似乎与屏幕刷新完全同步了。成功!
https://stackoverflow.com/questions/7090774
复制相似问题