如何理解dumpsys SurfaceFlinger

And*_*Jay 6 android adb surfaceflinger

是否有关于adb命令"dumpsys SurfaceFlinger"输出的文档?

特别是,我想了解HWC或GLES图层类型之间的区别,以及numHwLayers的含义是什么?

这是我正在谈论的dumpsys SurfaceFlinger的部分:

  mDebugForceFakeVSync=0
  Display[0] : 768x1280, xdpi=319.790009, ydpi=318.744995, refresh=16666667
  numHwLayers=5, flags=00000000
    type    |  handle  |   hints  |   flags  | tr | blend |  format  |       source crop         |           frame           name
------------+----------+----------+----------+----+-------+----------+---------------------------+--------------------------------
       GLES | b7e1c440 | 00000002 | 00000000 | 00 | 00100 | 00000002 | [  334,   56, 1102, 1190] | [    0,   50,  768, 1184] com.android.systemui.ImageWallpaper
       GLES | b7e1d7c8 | 00000002 | 00000000 | 00 | 00105 | 00000001 | [    0,   50,  768, 1184] | [    0,   50,  768, 1184] com.android.launcher/com.android.launcher2.Launcher
       GLES | b7e701e0 | 00000002 | 00000000 | 00 | 00105 | 00000001 | [    0,    0,  768,   50] | [    0,    0,  768,   50] StatusBar
       GLES | b7e1df68 | 00000002 | 00000000 | 00 | 00100 | 00000001 | [    0,    0,  768,   96] | [    0, 1184,  768, 1280] NavigationBar
  FB TARGET | b7dd3ab0 | 00000000 | 00000000 | 00 | 00105 | 00000001 | [    0,    0,  768, 1280] | [    0,    0,  768, 1280] HWC_FRAMEBUFFER_TARGET
Run Code Online (Sandbox Code Playgroud)

And*_*Jay 15

好的,我有足够的想法回答我自己的问题,但如果有人有任何额外的意见,请留在评论中.还有一些额外的东西,我将在下面提到,但仍然不清楚.

首先,下面的链接有助于解释有关图像渲染和合成如何通过SurfaceFlinger发生的一些事情:http: //source.android.com/devices/graphics.html

如果您在链接中注意到,图像有两种方式发送到显示器.一种是在将图像发送到显示器之前用GPU处理图像,另一种是使用显示器的硬件覆盖来绕过GPU并将图像直接发送到显示器.后一种方法表现更好,但您只能使用一定数量的图层/叠加层(通常为4层).如果您有更多图层,则必须由GPU处理.

dumpsys SurfaceFlinger的部分位于我的问题的中心,显示了在调用dumpsys时有多少层,以及这些层是由硬件编写器(HWC)还是GPU(GLES)处理的.这解释了HWC和GLES的含义.此外,numHwLayers是显示器支持多少叠加(通常为4).

此外,还有"源裁剪"和"框架"坐标.源裁剪是将显示的图像部分.例如,如果它是一个跨越多个显示屏幕的壁纸(想想你在屏幕上滑动时在主屏幕上看到的内容),那么在给定的时刻,您只需要显示该较大壁纸图像的子部分.这意味着源裁剪只是告诉您当前正在使用的整个图像的哪个部分.它的框架部分是源图像的该部分将实际显示在屏幕上的位置.

dumpsys SurfaceFlinger命令的这一部分的代码位于:\ frameworks \native\services\surfaceflinger\DisplayHardware\HWComposer.cpp

它位于一个名为"HWComposer :: dump"的函数中

上面回答了我原来的问题,但下面是我注意到的一些额外的事情:

看起来组合类型比HWC和GLES更多.在上面提到的代码中,我看到了"BACKGROUND"和"FB TARGET"复合类型.当您在adb中键入"dumpsys SurfaceFlinger"时,FB TARGET似乎始终存在.我认为FB Target只是完整图像写入的帧缓冲区(有人请确认一下).即使设备处于睡眠状态,您也会看到这个FB TARGET.我不明白的是,这种背景类型是什么?我甚至无法猜测那一个.如果您知道这是什么,请发表评论.

谢谢!

  • 好的写作!你对"FB TARGET"是正确的.如果*all*图层与叠加层合成,则没有GLES合成,并且帧缓冲区目标图层未使用.在空闲系统上(当屏幕上没有任何变化时),HWC实际上可以切换到GLES,因为它需要较少的功率来组成一次并重复显示FB目标层,而不是以60fps叠加组成多个层.另请参见http://stackoverflow.com/questions/20822309/(现在有一个链接).忽略背景. (3认同)