gpt4 book ai didi

android - Opengl es 2.0 - 为什么 glFinish 在我的新安卓手机上给我的帧率比旧手机低?

转载 作者:太空宇宙 更新时间:2023-11-03 13:15:47 26 4
gpt4 key购买 nike

我最近将我的旧 Galaxy S2 手机升级到全新的 Galaxy S7,并且非常惊讶地发现我编写的旧游戏在新手机上的表现似乎更差。将所有内容简化为一个简单的项目后,我发现了问题 - 我在每个 onDrawFrame 结束时执行的 GLES20.glFinish() 调用。有了这个,有 glClear 但没有绘制调用,FPS 徘徊在 40 左右。没有 glFinish,稳定的 60 FPS。无论如何,我的旧 S2 都有稳定的 60 FPS。

然后我回到我的游戏,删除了 glFinish 方法调用,果然性能恢复到完美,并且没有明显的缺点。

为什么 glFinish 在我的新手机上降低了我的帧速率而不是我的旧手机?

最佳答案

我认为一个推测性的答案已经很好了,所以——很抱歉几乎肯定会重复很多你已经知道的内容:

发送到 OpenGL 的命令经历三种状态,相对于 GPU 方面的事物命名:

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

与运行 GPU 的代码通信通常很昂贵。因此,大多数 OpenGL 实现都接受您的调用,并且只是在您的内存空间中排队等待一段时间。在某些时候,它会决定一次通信是合理的,并将支付一次转移所有调用的费用,将它们提升到已提交状态。然后 GPU 将完成每一个(可能是无序的,前提是不破坏 API)。

glFinish:

... does not return until the effects of all previously called GL commands are complete. Such effects include all changes to GL state, all changes to connection state, and all changes to the frame buffer contents.

因此,在一段时间内该 CPU 线程可能一直在做其他事情,现在肯定不会了。但是,如果您不使用 glFinish,那么您的输出可能仍会出现,只是不清楚何时出现。 glFlush 通常是正确的前进方式 — 它会提前提交所有内容,而不是等待完成,因此所有内容肯定会很快出现,您不必费心等待。

OpenGL 与操作系统的绑定(bind)变化很大;一般来说,如果您的环境允许您这样做,您几乎肯定想要刷新而不是完成。如果既不刷新也不完成都是有效的,并且操作系统没有根据任何标准为您插入事情,那么您可能会招致一些额外的延迟(例如,您发出一帧的命令可能无法到达 GPU,直到您填满在下一帧再次未提交的队列)但是如果你无限期地做 GL 工作那么输出几乎肯定仍然会继续。

Android 基于 EGL。根据规范,3.9.3:

... eglSwapBuffers and eglCopyBuffers perform an implicit flush operation on the context ...

因此,我认为如果您使用双缓冲,则不需要在 Android 中执行刷新或完成。调用交换缓冲区将在绘制完成后立即进行缓冲区交换,而不会阻塞 CPU。

至于真正的问题,S7 有一个 Adreno 530 GPU。 S2 有一个 Mali T760MP6 GPU。 Malis 是 ARM 生产的,Adrenos 是高通生产的,所以它们是完全不同的架构和驱动程序实现。所以导致阻塞的差异几乎可以是任何东西。但这是允许的。 glFinish 不是必需的,它是一个非常生硬的工具;它可能不是主要的优化目标之一。

关于android - Opengl es 2.0 - 为什么 glFinish 在我的新安卓手机上给我的帧率比旧手机低?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36495038/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com