通过打印DisplayList调试graphics性能

在调试graphic,尤其是动画的性能问题时,我们通常采用traceview或者systrace进行分析。这两个工具各自有适合的问题类型:

如果是程序逻辑导致graphics缓慢,比如缓慢的数据库访问,进程间通讯等等的,那么traceview+dmtracedump是最有效的。
如果是由于绘画本身导致动画缓慢,那么问题就复杂一些了,原因可能是各式各样的:

  1. 第一种可能就是我们的view-hierachy太复杂,通过hierachy-viewer这个工具,或者打开developer options中的“Show GPU overdraw”可以检查出不必要的重绘。
  2. 第二种可能是在GUI绘制每一个frame的之后花了太多的时间去rebuild display list. 这点可以通过systrace的结果看到。解决的办法是在动画播放的过程中将不变的部分的layer_type设置成为hardware layer,告知gui可以将这个部分缓存成一个纹理,而不必每次重建display list,再重新渲染。此外,应该尽量使用android提供的view anim property来进行动画的播放,GUI的framework对这些“动画属性”做了特殊的优化,可以保证在animate这些属性的时候不必重新对整个view重建display list和重新渲染。
  3. 如果前两种方式都没能找到/解决问题,看到的systrace现象是在getDisplayList并没有花太多的时间,大部分的时间花在了drawDisplayList,或者eglSwapBuffer上(TBDR类型的GPU?)。那我们就需要将displayList的内容打印出来看下了。

Dump DisplayList并非是默认打开的,工程师需要手动将 g_HWUI_debug_display_list 设置成1, 并且重编hwui lib,并push到手机中。在运行动画的过程中,打开logcat, 并过滤OpenGLRenderer关键字即可

Leave a Reply

Your email address will not be published. Required fields are marked *