对于分析一些显示问题,我们需要使用adb shell dumpsys SurfaceFlinger命令来获取SurfaceFlinger的dump信息,因此这里来详细讲解下SurfaceFlinger的dump信息。
Display identification data:? ? ? //display信息? Display 19260441557360770 (HWC display 0): port=130 pnpId=QCM displayName="" ?//19260441557360770是HWC dislay id
Visible layers (count = 70)? ?//count的值来源于layersSortedByZ中layer的数量.
*- Output Layer 0xb4000073181a9a30(SurfaceView - com.qiyi.video/org.iqiyi.video.activity.PlayerActivity#0)? ?//括号里是当前layer的名称 Region visibleRegion (this=0xb4000073181a9a48, count=1) ?//visibleRegion,表示可见区域的大小.每个region可能包含多个区域,所以这里count也可能不等于1. ? ? [ ?0, ?38, 2340, 1041] ? ? ? ? Region visibleNonTransparentRegion (this=0xb4000073181a9ab0, count=1) ? ? [ ?0, ?38, 2340, 1041] ? ? ? ? Region coveredRegion (this=0xb4000073181a9b18, count=1) ? ? [ ?0, ?38, 2340, 1041] ? ? ? ? Region output visibleRegion (this=0xb4000073181a9b80, count=1) ? ? [ 39, ? 0, 1042, 2340] ? ? ? ? Region shadowRegion (this=0xb4000073181a9be8, count=1) ? ? [ ?0, ? 0, ? 0, ? 0] ? ? ? forceClientComposition=false clearClientTarget=true displayFrame=[39 0 1042 2340] sourceCrop=[0.000000 0.000000 1002.000000 2340.000000] bufferTransform=0 (0) dataspace=UNKNOWN (0) z-index=0? ? ? ? hwc: layer=0x0824 composition=DEVICE (2)? ??//表明这个layer是device合成
layerStack= ? 0, z= ? ? ? ?3, pos=(0,0), size=( ? 0, ? 0), crop=[ ?0, ? 0, ?-1, ?-1], cornerRadius=0.000000, isProtected=0, isOpaque=0, invalidate=1, dataspace=Default, defaultPixelFormat=Unknown/None, backgroundBlurRadius=0, color=(0.000,0.000,0.000,1.000), flags=0x00000000, tr=[0.00, 0.00][0.00, 0.00] parent=DefaultTaskDisplayArea#0 zOrderRelativeOf=none activeBuffer=[ ? 0x ? 0: ? 0,Unknown/None], tr=[0.00, 0.00][0.00, 0.00] queued-frames=0, mRefreshPending=0, metadata={5:4bytes}, cornerRadiusCrop=[0.00, 0.00, 0.00, 0.00], shadowRadius=0.000,? ?? ? ? //layerStack: 表示这个layer是保存在哪个layerstack中(不同的display是有不同的layerstack的,这点可以通过一个连接HDMI时的layerstack很容易确认). //z: 表示Z轴坐标,z值越大,layer越靠上. //pos: pos的值是layer左上角的位置. //size: 是layer的大小. //crop: crop代表裁剪区域. //isOpaque: 代表是否是不透明的,只有完全不透明的layer这个值才是1. //invalidate: 表示这个layer的数据是失效的,这个值绝大多数情况下都是0. //alpha: 表示了这张layer的透明度,这个值跟isOpaque是有区别的.isOpaque表示了这个layer可以是透明的,也就是没有显示数据的地方;而alpha表示透明度,也即是有数据的地方也可以因为透明度而受到影响产生透明的效果. //tr: 代表屏幕的旋转和缩放程度.大多数的layer实际上是不需要旋转和缩放的,因为他们定义的大小就是跟屏幕一致的.
Display 19260441557360770 HWC layers:? ?//Display 的layers合成信息 ----------------------------------------------------------------------------------------------------------------------------------------------- ?Layer name ? ? ? ? ? ?Z | ?Window Type | ?Layer Class | ?Comp Type | ?Transform | ? Disp Frame (LTRB) | ? ? ? ? ?Source Crop (LTRB) | ? ? Frame Rate (Explicit) [Focused] ----------------------------------------------------------------------------------------------------------------------------------------------- ?SurfaceView - com.qiyi.video/org.iqiyi.video.activity.PlayerActivity#0 ? rel ? ? -2 | ? ? ? ? ? ?0 | ? ? ? ? ? ?0 | ? ? DEVICE | ? ? ? ? ?0 | ? 39 ? ?0 1042 2340 | ? ?0.0 ? ?0.0 1002.0 2340.0 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[*] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ?com.qiyi.video/org.iqiyi.video.activity.PlayerActivity#0 ? rel ? ? ?0 | ? ? ? ? ? ?1 | ? ? ? ? ? ?0 | ? ? DEVICE | ? ? ? ? ?0 | ? ?0 ? ?0 1080 2340 | ? ?0.0 ? ?0.0 1080.0 2340.0 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[*] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ?ScreenDecorOverlay#0 ? rel ? ? ?0 | ? ? ? ? 2024 | ? ? ? ? ? ?0 | ? ? DEVICE | ? ? ? ? ?0 | ? ?0 ? ?0 1080 ? 60 | ? ?0.0 ? ?0.0 1080.0 ? 60.0 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[ ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ?ScreenDecorOverlayBottom#0 ? rel ? ? ?0 | ? ? ? ? 2024 | ? ? ? ? ? ?0 | ? ? DEVICE | ? ? ? ? ?0 | ? ?0 2280 1080 2340 | ? ?0.0 ? ?0.0 1080.0 ? 60.0 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[ ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
这里注意:SurfaceView的Layer Z轴位置是小于用来其宿主Activity窗口的Layer的Z轴位置的,但是前者会在后者的上面挖一个“洞”出来,以便它的UI可以对用户可见。实际上,SurfaceView在其宿主Activity窗口上所挖的“洞”只不过是在其宿主Activity窗口上设置了一块透明区域。 ?
|