首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iPhone OpenGL ES glFlush()速度不一致

iPhone OpenGL ES glFlush()速度不一致
EN

Stack Overflow用户
提问于 2011-08-17 17:43:18
回答 2查看 3.1K关注 0票数 4

我的presentRenderBuffer调用看起来是随机的(但在任何给定的程序运行期间通常都是一致的),它非常慢。我追踪到了presentRenderBufferglFlush()的调用,所以现在我在presentRenderBuffer之前调用了glFlush()。我在glFlush()上设置了一个定时器,它会做两件事中的一件,看起来是随机的。

glFlush()也可以

1)持续耗时0.0003秒

2)在大约0.019秒和0.030秒之间交替

最奇怪的是,这是独立于绘图代码的。即使我注释掉了所有的绘图代码,它所做的就是调用glClear(),我仍然只是随机地得到两个结果中的一个。

绘图方法由具有以下设置的CADisplayLink调用:

代码语言:javascript
复制
dLink = [[UIScreen mainScreen] displayLinkWithTarget:viewController selector:@selector(drawFrame)];
dLink.frameInterval = 1;
[dLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

我发现不可能确定是什么导致了其中一个结果的发生。有谁能提供点子吗?

EN

回答 2

Stack Overflow用户

发布于 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()实例。在您的情况下,它可能是多余的。

票数 3
EN

Stack Overflow用户

发布于 2011-08-22 16:06:19

我找到了我认为的问题所在。附加到EAGLView的视图控制器未设置为窗口的根视图控制器。相反,视图被手动添加为窗口的子视图。当这个问题得到纠正(以及其他几个相关的修复)时,drawFrame方法现在似乎与屏幕刷新完全同步了。成功!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7090774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档