performTraversals递归的原因,长egl缓冲区交换时间

pet*_*_sm 12 performance android systrace

我在Android 4.2.2上的非根Nexus 4上使用systrace测量我的应用程序的性能.我在报告中看到一些对我没有意义的事情,我想知道它们是否可能是systrace错误,或者是否有人可能知道这些症状可能的根本原因.

1-运行结束时performTraversals下的大型递归

链接到报告 - 请查看运行结束时的大曲线(~18s).我的理解是performTraversals处于框架级别,它绘制了用户界面的单个框架.所以对我来说没有任何意义,它下面可能会有递归调用.另外,因为我在运行结束时得到了这种指数堆栈,我认为这实际上只是运行结束时数据的systrace缺陷.这种递归是否可能?这是什么意思?

2- performTraversals在运行过程中递归,具有较长的缓冲区交换时间

链接到报告 - 有趣的行为开始于12秒左右.当我在跑步中间看到类似的东西时,我想我也许不应该写下这个.此外,我花了很多时间试图弄清楚什么可能会占用这么长的eglSwapBuffers/queueBuffer(我的应用程序不使用openGL,只是直接使用框架)无济于事,当一位同事告诉我只是忽略它因为交换缓冲区总是瞬间完成的.可能还有更多吗?这里有什么需要调查的吗?

fad*_*den 4

在报告 #1 中,CPU 0 的跟踪缓冲区在大约 5 秒内填满(请注意“CPU 0”行中没有数据)。你将开始看到开始但永远不会结束的东西,因为最终记录没有被记录下来。这就是为什么你会得到大的“performTraversals (Did Not Finish)”斑点。

报告 #2 中的内容相同——大约 10 秒后就结束了。

您可以使用“-b”标志增加缓冲区大小,例如-b 8192将为您提供 8MB 缓冲区。默认大小为 2MB。