- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我最近将我的旧 Galaxy S2 手机升级到全新的 Galaxy S7,并且非常惊讶地发现我编写的旧游戏在新手机上的表现似乎更差。将所有内容简化为一个简单的项目后,我发现了问题 - 我在每个 onDrawFrame 结束时执行的 GLES20.glFinish() 调用。有了这个,有 glClear 但没有绘制调用,FPS 徘徊在 40 左右。没有 glFinish,稳定的 60 FPS。无论如何,我的旧 S2 都有稳定的 60 FPS。
然后我回到我的游戏,删除了 glFinish 方法调用,果然性能恢复到完美,并且没有明显的缺点。
为什么 glFinish 在我的新手机上降低了我的帧速率而不是我的旧手机?
最佳答案
我认为一个推测性的答案已经很好了,所以——很抱歉几乎肯定会重复很多你已经知道的内容:
发送到 OpenGL 的命令经历三种状态,相对于 GPU 方面的事物命名:
与运行 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
andeglCopyBuffers
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/
我在我的应用程序中使用了两个 OpenGL 上下文。 第一个用于渲染数据,第二个用于后台加载和生成 VBO 和纹理。 当我的加载上下文生成一个 VBO 并将其发送到我的渲染线程时,除非我调用 glFl
以下代码在 Nvidia 驱动程序 361.91(及更早版本)中运行良好(Windows 7、Nvidia GTX 750 Ti),但在 364.72 和 368.69 等较新版本中挂起。现在,只有在
上下文:我正在测量 Qt 测试应用程序图形渲染期间的 cpu 使用情况。渲染是通过 Qt Quick 模块完成的,该模块使用基于 OpenGL 的专用场景图。 环境:我在运行 Windows CE 的
运行有区别吗 glFinish() 正在运行 glFenceSync(...) glClientWaitSync(...) 超时时间长吗? 我正在尝试做的事情:我运行一个 OpenGL 命令管道,我想
我无法区分调用 glFlush() 和 glFinish() 之间的实际区别。 文档说 glFlush() 和 glFinish() 会将所有缓冲的操作推送到 OpenGL,这样就可以确保它们都会被执
我使用的是 FBO+RBO,并且不是在默认帧缓冲区上进行常规双缓冲,而是绘制到 RBO,然后直接在单个缓冲 OpenGL 上下文中的默认 FBO (0) 的 GL_FRONT 缓冲区上进行 blit。
我最近将我的旧 Galaxy S2 手机升级到全新的 Galaxy S7,并且非常惊讶地发现我编写的旧游戏在新手机上的表现似乎更差。将所有内容简化为一个简单的项目后,我发现了问题 - 我在每个 onD
在OpenGL ES Programming Guide他们说: To summarize, your app needs to call the glFinish function to ensur
使用 NSOpenGLView 时有几个类似的 OpenGL 操作: glFlush() [[self openGLContext]flushBuffer] glFinish() glSwapAPPL
我是一名优秀的程序员,十分优秀!