我正在做安卓OpenGL ES实验,看看它在不同手机上的表现。在我的Logcat中,我得到带有下面任何一行的标记"SharedBufferStack“的日志消息
排程: tail=0,head=1,avail=2,queued=0 排程: tail=1,head=0,avail=2,queued=0
重复了几次,即使我没有使用这个应用程序(没有按下触摸或按钮并阻止了它的睡眠)。我想知道是什么原因造成的,即使这不是一个错误。它会影响性能吗?
更重要的是,我如何去除它?
我使用的是标准Eclipse和Android
发布于 2013-12-17 07:25:52
TLDR版本:在OpenGL ES的onDrawFrame()中调用Thread.sleep()引起的。
通过查看下面链接上的代码,我了解了其中的一些内容。client/SharedBufferStack.cpp
因此,这个SharedBufferStack是Android的SurfaceFlinger的一部分,由http://rahulonblog.blogspot.sg/2013/06/an-overview-of-surfaceflinger.html描述。
Surfaceflinger :它是一个系统范围的表面作曲家功能,驻留在android框架中。它获取来自不同应用程序的数据(即表面),这些数据可以是2D或3D,并最终将其组合成一个主表面,然后输入内存(即帧缓冲区)。面面板是根据曲面的位置、尺寸和其他参数进行合成的,虽然这种合成是由OpenGL( Surfaceflinger调用)完成的,但是需要Surfaceflinger来计算重叠函数等相关参数。
这意味着SharedBufferStack是由不同的应用程序共享图形界面的内存(如果我错了,请纠正我)。
在第281和282行中,调用LOGW(Logcat调用警告)。
LOGW("dequeue: tail=%d, head=%d, avail=%d, queued=%d",
tail, stack.head, stack.available, stack.queued);如果读取函数块的其余部分,SharedBufferClient::dequeue试图警告堆栈为空/接近空。
如果我胡思乱想,我认为“图形”堆栈至少需要有一些东西,否则它就没有什么可显示的。我仍然不知道为什么当stack.head==tail =0和stack.head = 1时它会调用它,我看不出它实际上是一个堆栈。
===更新1
显然,经过更多的测试后,我在onDrawFrame of OpenGL ES循环中调用的正是我的OpenGL。由于RENDERMODE_CONTINUOUSLY没有正确地控制框架(因为我希望将它限制在每秒30帧,而不是让它疯狂地运行),所以我让线程在剩下的时间内休眠。
Thread.sleep(16 - diffTime);如果我是对的,就睡opengl线程。显然,它会导致上面的消息出现,而且听起来不太好,因为您将图形线程从堆栈中删除。我认为我可以这样做的一种方法是运行一个单独的线程,该线程调用onDrawFrame来使用RENDERMODE_WHEN_DIRTY进行呈现。另一种方法是让它以同样的速度运行,但是每隔0.017秒(60 fps)调用您的逻辑循环或控制器,用于动画和其他东西。
===更新2
我做了一个,您允许尽可能快地呈现图像,但是使用时间来找出什么时候运行逻辑。
https://stackoverflow.com/questions/20617747
复制相似问题