首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGLES2.0--为什么glFinish在我的新安卓手机上给我的框架比旧手机要低?

OpenGLES2.0--为什么glFinish在我的新安卓手机上给我的框架比旧手机要低?
EN

Stack Overflow用户
提问于 2016-04-08 08:32:26
回答 1查看 1.7K关注 0票数 3

最近,我将我的旧Galaxy S2手机升级为全新的Galaxy S7,非常惊讶地发现,我写的一款旧游戏在新手机上的表现似乎更差。在将所有内容简化为一个基本的项目之后,我发现了问题--我在每个onDrawFrame的末尾执行的GLES20.glFinish()调用。在这里,有了一个glClear,但没有平局调用,FPS徘徊在40左右。没有glFinish,固体60 FPS。不管怎么说,我的旧S2都有坚实的60 FPS。

然后我回到我的游戏中,删除了glFinish方法调用,确定足够的性能恢复到完美状态,并且删除它没有明显的缺点。

为什么glFinish在我的新手机上减慢了我的帧率,而不是我的旧手机?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-08 18:48:30

我认为一个投机性的答案是最好的,所以-道歉几乎肯定重复了你已经知道的很多东西:

发送给OpenGL的命令经过三种状态,命名为相对于GPU端的事物:

  1. 未提交
  2. 提交但待决
  3. 已完成

与运行GPU的代码通信通常很昂贵。因此,大多数OpenGL实现都接受调用,只需在内存空间中将工作排队一段时间。在某个时候,它将决定通信是合理的,并将支付立即传输所有调用的成本,从而将它们提升到提交的状态。然后GPU将完成每一个(潜在的无序,前提是不破坏API)。

glFinish

..。直到所有以前称为GL命令的效果完成后才返回。这些影响包括对GL状态的所有更改、对连接状态的所有更改以及对帧缓冲区内容的所有更改。

因此,有一段时间,当CPU线程可能在做其他事情时,它现在肯定不会了,但是如果您没有glFinish,那么您的输出可能仍然会出现,只是不清楚什么时候。glFlush通常是正确的前进方式--它会提前提交所有东西,而不是等待完成,所以所有事情都会很快出现,你就不用等它了。

到操作系统的OpenGL绑定有很大不同;通常情况下,如果环境允许的话,您几乎肯定希望刷新而不是完成。如果它既不能刷新也不能完成,并且操作系统没有根据任何标准为您推展,那么您可能会产生一些额外的延迟(例如,在下一个帧中,您发出的命令可能不会到达GPU ),但是如果您正在无限期地执行GL工作,那么输出几乎肯定仍将继续进行。

Android坐在EGL上。根据规范,3.9.3:

eglSwapBufferseglCopyBuffers对上下文执行隐式刷新操作..。

因此,我认为,如果要双缓冲,则不需要在Android中执行刷新或完成操作。在不阻塞CPU的情况下,一旦绘图完成,调用交换缓冲区就会导致缓冲区交换。

至于真正的问题,S7有一个Adreno53GPU。S2有一个马里T760MP6图形处理器。Malis由ARM生产,Adrenos由高通( Qualcomm )生产,因此它们是完全不同的架构和驱动实现。所以造成阻塞的区别可能是任何东西。但这是允许的。glFinish不是必需的,而且是一个非常钝的工具;它可能不是主要的优化目标之一。

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

https://stackoverflow.com/questions/36495038

复制
相关文章

相似问题

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