我正在Android-9 Xiaomi mi A3设备上运行OpenGL ES3.2应用程序。
框架断断续续,因为应用程序有时会冻结一会儿。
借助我的profiler,我已经确定暂停发生在eglSwapBuffers()通话中。
现在,通常,eglSwapBuffers()耗时约0.7ms。很好,因为对于60Hz帧,我有16.6毫秒。
但是在上面运行的配置文件中,当缓冲区交换花费的时间多了 30 时,它显示了停顿。
还请注意:这是壁钟时间,cpu时间似乎很好,因此,不是CPU繁忙,而是CPU等待。 (可能正在等待GPU。)
发生这种情况的框架,与其他框架没有什么不同:没有额外的图纸,没有额外的负荷。
OpenGL上下文非常原始:
- 24位深度
- 32位RGBA
- 没有模具
- ES 3.2上下文
- Adreno 610 GPU
I/hexa (31916): GL_VENDOR Qualcomm
I/hexa (31916): GL_RENDERER Adreno (TM) 610
I/hexa (31916): GL_VERSION OpenGL ES 3.2 V@378.0 (GIT@6cbc6c9,Ib736691963) (Date:04/25/19)
我制作了许多其他的Android OpenGL应用程序,但都没有这种行为。
该应用基于NDK,使用Nativityactivity类,还使用android_native_app_glue.h
这是在电话充电时发生的,所以我怀疑这可以节省一些能源。
更新:我在eglSwapBuffers()之前添加了glFlush()
,并且延迟转移到了刷新。因此,确实是在这种情况下,即使场景大小没有改变,突然也执行了许多额外的OpenGL工作。