performTraversals递归的原因,导致EGL缓冲交换时间长。

12

我正在使用非Root的Nexus 4 Android 4.2.2上的systrace来测量我的应用程序性能。在报告中,我看到了一些不合理的东西,并且想知道这可能是systrace的错误还是是否有任何可能导致这些症状的根本原因。

1- 运行结束时,在performTraversals下出现大量递归

报告链接 - 请查看运行结束时(约18秒)的大曲线。我的理解是performTraversals位于框架级别,用于绘制用户界面的单帧。因此,对它进行递归调用没有意义。而且由于我在运行结束时得到这种指数级堆叠,我认为这实际上只是systrace在运行结束时出现了缺陷。这种递归是否可能存在?这是什么意思?

2- 在运行中间出现performTraversals递归,同时长时间的缓冲区交换时间

报告链接 - 有趣的行为始于第12秒左右。当我在运行中看到类似的情况时,我开始想也许我不该对此置之不理。此外,尽管我的应用程序没有使用OpenGL,而是直接使用框架,但我花了很多时间尝试弄清楚可能导致如此长的eglSwapBuffers/queueBuffer的原因,但是都没有成功,直到一个同事告诉我只需忽略它,因为交换缓冲区总是瞬间完成。这里是否还有更多需要探究的呢?
1个回答

4
在报告 #1 中,CPU 0 的跟踪缓冲区在大约 5 秒钟时填满了(请注意“CPU 0”行中没有数据)。你将开始看到一些开始但从未结束的东西,因为结束记录没有被记录。这就是为什么你会得到大量的“performTraversals (Did Not Finish)”块。
在报告 #2 中也是同样的情况,在大约 10 秒钟时用完。
您可以使用“-b”标志增加缓冲区大小,例如-b 8192将给您提供 8MB 的缓冲区。默认大小为 2MB。

太棒了,谢谢!我之前以为在使用systrace时,Android会内部填充缓冲区,然后在接近满时异步刷新它。但是从你的回答中我得出结论,这是错误的,缓冲区只是填满了,当发生这种情况时,跟踪就会停止。我还了解到,这是基于每个CPU的,因此如果CPU 1自跟踪开始以来的活动较少,则在CPU 0填满后,CPU 1上的活动可能仍将继续被跟踪。 这正确吗? - peterb_sm
是的。每个CPU核心都有一个独立的缓冲区,因此日志记录代码可以在不需要使用锁或原子操作的情况下写入它。 - fadden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接