是什么导致Android';什么是LogCat?
我正在做Android OpenGL ES实验,看看它在不同手机上的表现。在我的Logcat中,我得到标记为“SharedBufferStack”的日志消息,下面有两行 出列:尾部=0,头部=1,有效性=2,排队=0 出列:尾部=1,头部=0,有效性=2,排队=0 重复几次,即使我不使用该应用程序(没有触摸或按钮按下,并且阻止它睡眠)。我想知道是什么导致了它,即使它不是一个错误。它会影响性能吗 更重要的是,如何删除它是什么导致Android';什么是LogCat?,android,logging,opengl-es,logcat,Android,Logging,Opengl Es,Logcat,我正在做Android OpenGL ES实验,看看它在不同手机上的表现。在我的Logcat中,我得到标记为“SharedBufferStack”的日志消息,下面有两行 出列:尾部=0,头部=1,有效性=2,排队=0 出列:尾部=1,头部=0,有效性=2,排队=0 重复几次,即使我不使用该应用程序(没有触摸或按钮按下,并且阻止它睡眠)。我想知道是什么导致了它,即使它不是一个错误。它会影响性能吗 更重要的是,如何删除它 我将标准Eclipse与Android SDK一起使用TLDR版本:由调用Op
我将标准Eclipse与Android SDK一起使用TLDR版本:由调用OpenGL ES的onDrawFrame()中的Thread.sleep()引起 我在下面的链接中看到了他们的代码。 所以这个SharedBufferStack是Android的SurfaceFlinger的一部分,在 Surfaceflinger:它是一个系统范围的surface composer函数,驻留在android框架中。它从不同的应用程序(可能是2D或3D)获取数据(即曲面),最后将其合并以获得一个主曲面,该曲面将被送入内存(即帧缓冲区)。 Surfaceflinger根据曲面的位置、大小和其他参数合成所有曲面,虽然该合成是由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将尝试警告堆栈为空/接近空
如果我胡乱猜测的话,我认为“图形”堆栈至少需要打开一些东西,否则它就没有什么可显示的了。我仍然不知道为什么它在tail=0和stack.head=1时调用stack.head==tail。我看不出它实际上是一堆
==更新1
显然,经过更多的测试后,我在OpenGL ES循环的onDrawFrame中调用了Thread.sleep。由于RENDERMODE_持续不正确地控制帧速率(因为我想将其限制为每秒30帧,而不是让它运行得太快),所以我让线程在剩余的时间内休眠
Thread.sleep(16 - diffTime);
如果我是对的,它会休眠opengl线程。显然,它会导致上面的消息出现,而且听起来不太好,因为您将图形线程从堆栈中移除。我认为我可以做的一种方法是运行一个单独的线程,当渲染模式脏时调用onDrawFrame来渲染。另一种方法是让它以同样快的速度运行,但每隔0.017s(60fps)的间隔调用逻辑循环或控制器,以获取动画和其他内容
==更新2
我做了一个让图像尽可能快地渲染的例子,但要花时间找出何时运行逻辑。感谢您的编辑提示:)