首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是什么导致安卓的SharedBufferStack消息出现在LogCat上?

是什么导致安卓的SharedBufferStack消息出现在LogCat上?
EN

Stack Overflow用户
提问于 2013-12-16 18:06:47
回答 1查看 183关注 0票数 0

我正在做安卓OpenGL ES实验,看看它在不同手机上的表现。在我的Logcat中,我得到带有下面任何一行的标记"SharedBufferStack“的日志消息

排程: tail=0,head=1,avail=2,queued=0 排程: tail=1,head=0,avail=2,queued=0

重复了几次,即使我没有使用这个应用程序(没有按下触摸或按钮并阻止了它的睡眠)。我想知道是什么原因造成的,即使这不是一个错误。它会影响性能吗?

更重要的是,我如何去除它?

我使用的是标准Eclipse和Android

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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调用警告)。

代码语言:javascript
复制
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帧,而不是让它疯狂地运行),所以我让线程在剩下的时间内休眠。

代码语言:javascript
复制
Thread.sleep(16 - diffTime);

如果我是对的,就睡opengl线程。显然,它会导致上面的消息出现,而且听起来不太好,因为您将图形线程从堆栈中删除。我认为我可以这样做的一种方法是运行一个单独的线程,该线程调用onDrawFrame来使用RENDERMODE_WHEN_DIRTY进行呈现。另一种方法是让它以同样的速度运行,但是每隔0.017秒(60 fps)调用您的逻辑循环或控制器,用于动画和其他东西。

===更新2

我做了一个,您允许尽可能快地呈现图像,但是使用时间来找出什么时候运行逻辑。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20617747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档