Andorid Surface(3.3)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
3.3 adb shell dumpsys SurfaceFlinger介绍

​ dumpsys命令是Android系统内置的命令,可以查看和调试系统级别的信息。它可以提供广泛的诊断信息,包括系统服务、硬件状态和应用程序信息等。常用于调试和优化Android应用程序。

dumpsys SurfaceFlinger里面的内容说明:

/**构建配置:指定一些系统配置,包括:PRESENT_TIME_OFFSET=0,FORCE_HWC_FOR_RBG_TO_YUV=1,MAX_VIRT_DISPLAY_DIM=0,RUNNING_WITHOUT_SYNC_FRAMEWORK=0,NUM_FRAMEBUFFER_SURFACE_BUFFERS=3,
通常来说,0代表关闭或者关机,1代表打开或者开机。
NUM_FRAMEBUFFER_SURFACE_BUFFERS是指在OpenGL ES中用于存储渲染缓冲区的表面缓冲区的数量。它指定了用于多重采样或双缓冲的表面缓冲区的数量。双缓冲通常需要两个表面缓冲区,而多重采样可能需要更多的表面缓冲区。这个参数通常由OpenGL ES应用程序的开发人员在初始化渲染上下文时设置,以便配置好所需的表面缓冲区数量。**/
Build configuration: [sf PRESENT_TIME_OFFSET=0 FORCE_HWC_FOR_RBG_TO_YUV=1 MAX_VIRT_DISPLAY_DIM=0 RUNNING_WITHOUT_SYNC_FRAMEWORK=0 NUM_FRAMEBUFFER_SURFACE_BUFFERS=3]

下面是显示器信息:

Display identification data:
//Display ****(HWC display 0)就是显示器的标识符,port表示连接的端口号,pnpId=QCM表示设备的 Plug-and-Play (PnP) ID,显示名字是空
Display 4630946950956839809 (HWC display 0): port=129 pnpId=QCM displayName=""

下面是色域信息:

//下面dumpsys信息表示的是色域信息,大致的意思如下:表示设备具有内置的广色域显示屏(Wide-Color),并且支持颜色管理功能。它的显示颜色设置是经过管理的(Managed),并且支持三种颜色模式:Native、sRGB和Display P3。当前的颜色模式是sRGB。
Wide-Color information:
Device has wide color built-in display: 1
Device uses color management: 1
DisplayColorSetting: Managed
Display 4630946950956839809 color modes:
ColorMode::NATIVE (0)
ColorMode::SRGB (7)
ColorMode::DISPLAY_P3 (9)
Current color mode: ColorMode::SRGB (7)

下面是同步机制:

//表明该系统使用了EGL_ANDROID_native_fence_sync和EGL_KHR_wait_sync来实现同步机制。
Sync configuration: [using: EGL_ANDROID_native_fence_sync EGL_KHR_wait_sync]

下面是调度信息:

/**Scheduler 表示调度程序,是一种计算机程序或算法,用于管理计算机系统中的任务和进程,并按照特定的规则和优先级分配系统资源,例如 CPU 时间、内存、硬盘空间和网络带宽等。调度程序可确保任务正确高效地运行,同时避免资源冲突和系统崩溃。在操作系统中,调度程序是非常重要的组成部分之一,负责协调系统中的各种任务和进程,确保计算机系统高效且稳定地工作。
这段配置信息表示Scheduler的设置,其中Idle定时器、Touch定时器和内容检测都关闭了。同时也给出了LayerHistory的一些信息,包括历史图层的大小为157,活动图层为2。**/
Scheduler:
+  Idle timer: off
+  Touch timer: off
+  Content detection: off LayerHistory{size=157, active=2}

帧率相关:

/**Frame Rate Overrides (backdoor): {}:这个参数表示通过后门方式设置的帧率覆盖。帧率覆盖可以通过特殊的调试或测试方法在 SurfaceFlinger 中设置,用于强制修改显示帧率。在这个输出中,花括号 {} 表示当前没有任何帧率覆盖设置。
Frame Rate Overrides (setFrameRate): {}:这个参数表示使用 setFrameRate() 方法设置的帧率覆盖。setFrameRate() 是 Surface 对象的一个方法,用于设置 Surface 的显示帧率。在这个输出中,花括号 {} 表示当前没有任何帧率覆盖设置。
ScreenOff: 25d08:01:27.243:这个参数表示当屏幕关闭时的帧率设置。具体数值表示从屏幕关闭到当前时间的时间间隔。这个参数告诉你在屏幕关闭期间的帧率设置情况。
60.00fps: 21d23:07:38.933:这个参数表示一个帧率设置项,其中 60.00fps 表示帧率设置为 60 帧每秒,后面的时间表示该帧率设置生效的时间。
90.00fps: 0d12:43:21.078:这个参数表示另一个帧率设置项,其中 90.00fps 表示帧率设置为 90 帧每秒,后面的时间表示该帧率设置生效的时间。
ScreenOff: 25d08:01:27.243  那这个里面的 25d08 表示什么意思?
在 ScreenOff: 25d08:01:27.243 中,25d08 表示一个时间间隔。这个时间间隔以天(d),小时(h),分钟(m)和秒(s)为单位来表示。
具体解读如下:
25d:表示25天。
08h:表示8小时。
01m:表示1分钟。
27.243s:表示27.243秒。
因此,整个时间间隔为25天、8小时、1分钟和27.243秒。
这个时间间隔指示了从屏幕关闭到当前时间的时间长度,提供了在屏幕关闭期间的帧率设置情况。
**/
Frame Rate Overrides (backdoor): {}
Frame Rate Overrides (setFrameRate): {}
ScreenOff: 24d20:49:33.097
60.00fps: 21d12:37:35.824
90.00fps: 0d12:31:39.576

时间值:

/**
这段输出表示应用程序和SurfaceFlinger(SF)的不同阶段和持续时间的时间值。下面是对每个参数的解释:

app phase:应用程序阶段的时间值,单位为纳秒(ns)。
SF phase:SurfaceFlinger阶段的时间值,单位为纳秒(ns)。
app duration:应用程序持续时间的时间值,单位为纳秒(ns)。
SF duration:SurfaceFlinger持续时间的时间值,单位为纳秒(ns)。
另外还有以下类似的参数:

early app phase:应用程序早期阶段的时间值。
early SF phase:SurfaceFlinger早期阶段的时间值。
early app duration:应用程序早期持续时间的时间值。
early SF duration:SurfaceFlinger早期持续时间的时间值。
还有一些带有前缀 GL 的参数,表示与OpenGL相关的阶段和持续时间。

这些参数提供了应用程序和SurfaceFlinger在不同阶段执行的时间信息。它们可以用于分析和优化应用程序的性能,以及了解应用程序与SurfaceFlinger之间的交互时间。每个阶段的时间值和持续时间值可以帮助开发人员确定瓶颈和优化点,并改进应用程序的响应性和渲染性能。
**/
app phase:      1000000 ns	         SF phase:      1000000 ns
           app duration:  16666666 ns	         SF duration:  15666666 ns
     early app phase:      1000000 ns	   early SF phase:      1000000 ns
     early app duration:  16666666 ns	   early SF duration:  15666666 ns
  GL early app phase:      1000000 ns	GL early SF phase:      1000000 ns
  GL early app duration:  16666666 ns	GL early SF duration:  15666666 ns

合成器相关:

HWC min duration:         0 ns
      present offset:         0 ns	     VSYNC period:  16666666 ns
      
在输出中,有两个参数与硬件合成器(Hardware Composer)相关:
HWC min duration:表示硬件合成器的最小持续时间,单位为纳秒(ns)。这个值指示了硬件合成器在执行合成操作时的最小时间要求。较低的最小持续时间可能会导致合成器频繁触发合成操作,从而增加系统负载。
present offset:表示显示帧的偏移时间,单位为纳秒(ns)。它指示了应用程序提交帧到硬件合成器的时间与实际在显示器上显示的时间之间的差异。较高的偏移时间可能导致显示上的不一致或延迟。
另外,还有一个与垂直同步(VSYNC)相关的参数:
VSYNC period:表示垂直同步周期的时间值,单位为纳秒(ns)。VSYNC是一种同步机制,用于将图形渲染与显示器的刷新频率同步。该参数指示了两次垂直同步之间的时间间隔。在理想情况下,应用程序的帧率与VSYNC周期保持一致,以获得流畅的动画和视觉效果。
这些参数提供了与硬件合成器和显示相关的时间信息,可用于分析和优化图形渲染性能。通过了解硬件合成器的最小持续时间、帧偏移和垂直同步周期,开发人员可以调整应用程序的渲染逻辑,以获得更好的性能和显示效果。

显示模式规格:

DesiredDisplayModeSpecs (DisplayManager): default mode ID: 0, allowGroupSwitching = 0, primary range: [0.00fps 60.00fps], app request range: [0.00fps 60.00fps]

在输出中,DesiredDisplayModeSpecs 表示所需的显示模式规格。以下是对输出中参数的解释:
default mode ID: 0:默认的显示模式ID为0。每个显示器可以支持多个显示模式,其中一个被指定为默认模式。
allowGroupSwitching = 0:表示是否允许切换显示模式组。如果值为0,则不允许切换;如果值为1,则允许切换。
primary range: [0.00fps 60.00fps]:主显示模式的刷新率范围。该范围表示主显示模式支持的最低刷新率和最高刷新率。在这个示例中,范围是从0.00fps到60.00fps。
app request range: [0.00fps 60.00fps]:应用程序请求的刷新率范围。该范围表示应用程序希望显示器支持的最低刷新率和最高刷新率。在这个示例中,范围是从0.00fps到60.00fps。
这些参数提供了关于显示模式的信息,包括默认模式、允许切换的模式组以及刷新率范围。刷新率是指显示器每秒更新图像的次数,较高的刷新率可以提供更平滑的动画和视觉效果。应用程序可以请求特定的刷新率范围,但实际的刷新率可能受到设备和显示器的限制。

当前模式:

Current mode: {id=0, hwcId=0, fps=60.00, width=1080, height=2400 group=0}

在输出中,Current mode 表示当前的显示模式。以下是对输出中参数的解释:
id=0:当前显示模式的唯一标识符。在这个示例中,标识符为0。
hwcId=0:硬件合成器使用的显示模式标识符。在这个示例中,与显示模式的唯一标识符相同。
fps=60.00:当前显示模式的刷新率,以每秒帧数(Frames Per Second)表示。在这个示例中,刷新率为60.00fps。
width=1080:当前显示模式的宽度,以像素为单位。在这个示例中,宽度为1080像素。
height=2400:当前显示模式的高度,以像素为单位。在这个示例中,高度为2400像素。
group=0:当前显示模式所属的模式组。模式组是一组相关的显示模式,可能具有相似的特性或设置。在这个示例中,该显示模式属于模式组0。
这些参数提供了当前使用的显示模式的详细信息,包括刷新率、分辨率和模式组。显示模式可以根据应用程序的需求和设备的支持进行调整,以获得最佳的视觉效果和性能。

刷新率:

Refresh rates:
	{id=1, hwcId=1, fps=90.00, width=1080, height=2400 group=0}
	{id=0, hwcId=0, fps=60.00, width=1080, height=2400 group=0}
Supports Frame Rate Override: no

在输出中,Refresh rates 表示可用的刷新率列表。以下是对输出中每个刷新率参数的解释:
id:刷新率的唯一标识符。
hwcId:硬件合成器使用的刷新率标识符。
fps:刷新率,以每秒帧数(Frames Per Second)表示。
width:显示模式的宽度,以像素为单位。
height:显示模式的高度,以像素为单位。
group:显示模式所属的模式组。
根据你的输出,可见有两个可用的刷新率:
刷新率1:id为1,hwcId为1,刷新率为90.00fps,宽度为1080像素,高度为2400像素,属于模式组0。
刷新率0:id为0,hwcId为0,刷新率为60.00fps,宽度为1080像素,高度为2400像素,属于模式组0。
最后的参数 "Supports Frame Rate Override: no" 表示设备不支持帧率覆盖。帧率覆盖是指在某些情况下,应用程序可以覆盖默认的刷新率设置,以适应特定的需求或优化目的。然而,在你的设备上,不支持对刷新率进行覆盖。
(mode override by backdoor: no)

在输出中的 "(mode override by backdoor: no)" 表示当前没有通过后门进行显示模式的覆盖。
后门是指一种机制,允许在某些情况下直接修改或覆盖显示模式的设置。通常,后门是一种高级调试或开发工具,用于在特定环境中对显示模式进行定制或调试。在你的输出中,显示模式没有通过后门进行覆盖,即没有通过后门手段修改或改变当前的显示模式设置。
这意味着当前的显示模式是由系统或设备的默认设置确定的,并且没有通过特殊手段进行修改。

vsync相关:

app: state=VSync VSyncState={displayId=4630946950956839809, count=100525810}

在输出中,app: state=VSync 表示应用程序的状态为VSync(垂直同步)。垂直同步是一种与显示器刷新率同步的机制,用于控制应用程序的渲染速率,以避免画面撕裂和不同步的问题。
VSyncState={displayId=4630946950956839809, count=100525810} 提供了与VSync相关的状态信息:
displayId=4630946950956839809:显示器的唯一标识符。每个显示器都有一个唯一的标识符,用于区分不同的显示设备。
count=100525810:VSync计数器的当前值。VSync计数器是一个递增的值,表示自系统启动以来的VSync事件数量。
这些参数提供了应用程序在VSync状态下的相关信息。VSync状态对应于应用程序与显示器刷新率同步的情况,确保应用程序的渲染与显示器的垂直刷新之间保持同步。

连接:

pending events (count=0):
  connections (count=73):
    Connection{0xb400007e7299f8c0, 1127, VSyncRequest::None}

在输出中,pending events (count=0) 表示当前没有待处理的事件。
connections (count=73) 表示当前的连接数为73,指示与SurfaceFlinger的连接数量。
Connection{0xb400007e7299f8c0, 1127, VSyncRequest::None} 是连接的详细信息,包括连接的标识符、VSync请求类型等。
0xb400007e7299f8c0 是连接的唯一标识符。
1127 是连接的ID。
VSyncRequest::None 表示该连接没有特定的VSync请求。
这些信息提供了与连接和事件处理相关的状态信息,可以帮助跟踪和了解SurfaceFlinger的连接情况和待处理事件的数量。

Connection{0xb400007e47284f80, 18443, VSyncRequest::Single} 这里面的single是什么意思?
在输出中,Connection{0xb400007e47284f80, 18443, VSyncRequest:
Android dumpsys SurfaceFlinger分析 对于分析一些显示问题,我们需要使用adb shell dumpsys SurfaceFlinger命令来获取SurfaceFlinger的dump信息,因此这里来详细讲解下SurfaceFlinger的dump信息。 Display identification data: //display信息 Display 19260441557360770 (HWC display 0): port=130 pnpId=QCM displayName="" //19260441557360770是H... 阅读详情

相关推荐

Android 性能之刷新率设置和管理

对于 Android 平台来说,屏幕的刷新率会影响应用绘制的调度周期。一般情况下平台调度绘制的周期与屏幕刷新的周期同步,这是通过 vsync 机制来实现的。

专注于系统快稳省领域 1万+

SurfaceFlinger源码摘要

Android中两个主要的服务,AMS(ActivityManagerService)和WMS(WindowManagerService). View,AMS,WMS可以说是整个上层显示系统的三驾马车 在Android中,一个窗口用一个Surface描述。多个窗口(窗口不一定都是Activity),需要同时显示,我们就需要将多个窗口进行合并。 Surfaceflinger控制窗口的合成,将多个窗口合并成一个,再送到LCD。 Surfaceflinger是Native的服务. Surfaceflinger中怎

fdsafwagdagadg6576的专栏 1801

Android Graphics 显示系统 - 导出指定图层Layer数据与图层合成探秘

工作中会遇到一些问题,需要把单个图层的数据导出到文件来判断raw data是否有异常,同一时刻往往会存在多个图层,那如何根据需要导出单个指定的图层数据呢?

向晚流年 1757

MirrorLayer可以正常触摸屏幕原理分析

在多屏互动时候有一个屏幕的画面是一个MirrorLayer,另一个屏幕画面是真实的,即2个屏幕上有一个是MirrorLayer,这个时候疑问就来了,经过在aosp13上体验发现,两个屏幕画面都可以正常接受触摸事件进行正常的事件响应。到这里就可以理解为啥两个屏幕各自的mirrorlayer和正常layer都可以正常接受触摸事件的原因,因为在input派发选择窗口,遍历window时候,都对应是同一个windowinfo。这里的inputInfo就是最为关键的信息,也就是最后传递给input端的关键点。

liaosongmao1的专栏 313

Androidsurface的三种工作方式

Surface的三种使用方式 Native层的Surface工作方式有:仅在Proxy端、Proxy和Service端协同、仅在Service端工作三种方式(第三种方式有待确认)。前两种方式在Proxy端都有共同的预处理工作要做,如下: Proxy端 1、创建SurfaceFlinger的本地代理 sp client = new SurfaceComposerClient();

zou128865的专栏 1335

深入浅出,Andorid 端屏幕采集技术实践

** 前言 ** 随着全球产业链线上化和数字化的加速,移动端实时屏幕共享在各行各业场景下都有了广泛的应用,比如在线教育、视频会议、远程业务咨询、手游直播。而屏幕采集则是实现实时屏幕共享流程中的第一步,本篇技术分享就来跟大家讲讲拍乐云在 Andorid 端屏幕采集的经验实践。 背景 Android 从 4.0 开始就提供了手机录屏方法,但是需要 root 权限。从 5.0 开始,Google 开放了系统录屏API:MediaProjection 和 MediaProjectionManager,不需要 roo

Pano2019的博客 1005

深入浅出,Andorid 端屏幕采集技术实践(1)

3.如果需要将屏幕采集数据显示在UI界面 SurfaceView 上的话,Surface可以通过以下方式生成: SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surface);当我们出去找工作,或者准备找工作的时候,我们一定要想,我面试的目标是什么,我自己的技术栈有哪些,近期能掌握的有哪些,我的哪些短板 ,列出来,有计划的去完成,别看前两天掘金一些大佬在驳来驳去 ,他们的观点是他们的,不要因为他们的观点,膨胀了自己,影响自己的学习节奏。

2401_84121588的博客 1360

深入浅出,Andorid 端屏幕采集技术实践,从入门到精通

随着全球产业链线上化和数字化的加速,移动端实时屏幕共享在各行各业场景下都有了广泛的应用,比如在线教育、视频会议、远程业务咨询、手游直播。而屏幕采集则是实现实时屏幕共享流程中的第一步,本篇技术分享就来跟大家讲讲拍乐云在 Andorid 端屏幕采集的经验实践。 背景 Android 从 4.0 开始就提供了手机录屏方法,但是需要 root 权限。从 5.0 开始,Google 开放了系统录屏API:MediaProjection 和 MediaProjectionManager,不需要 root 权限,但是会弹

m0_65322636的博客 853

android surfaceflinger研究----Surface机制

前一篇文章介绍了Android的显示系统,这篇文章中,我们把视角往上层移动一下,研究一下framework是如何与surfaceflinger进行业务交互的。如何创建surface,如何显示窗口等等,所有的这一切都是通过系统服务WindowManagerService与surfaceflinger来进行的。     android中的Surface机制这一块代码写的比较难理解,光叫Surface

omnispace的博客 769

深入浅出,Andorid 端屏幕采集技术实践,kotlin创建数组

随着全球产业链线上化和数字化的加速,移动端实时屏幕共享在各行各业场景下都有了广泛的应用,比如在线教育、视频会议、远程业务咨询、手游直播。而屏幕采集则是实现实时屏幕共享流程中的第一步,本篇技术分享就来跟大家讲讲拍乐云在 Andorid 端屏幕采集的经验实践。 背景 Android 从 4.0 开始就提供了手机录屏方法,但是需要 root 权限。从 5.0 开始,Google 开放了系统录屏API:MediaProjection 和 MediaProjectionManager,不需要 root 权限,但是会弹

m0_65321095的博客 510

2024年安卓最新深入浅出,Andorid 端屏幕采集技术实践(3),2024年最新面试必备的材料

本文针对 Android 端屏幕采集涉及到的屏幕数据生产者,数据缓冲区做了简单介绍,其实消费者对屏幕原始数据的处理更是整个屏幕共享流程中关键的步骤。另外对屏幕采集的分辨率、帧率的控制,横竖屏切换适配等问题也只是理论上阐述,具体代码实现还是有很多细节需要注意。

2401_84123077的博客 575

Android应用程序窗口(Activity)的绘图表面(Surface)的创建过程分析

从前面Android应用程序与SurfaceFlinger服务的关系概述和学习计划和Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划这两个系列的文章可以知道,每一个在C++层实现的应用程序窗口都需要有一个绘图表面,然后才可以将自己的UI表现出来。这个绘图表面是需要由应用程序进程请求SurfaceFlinger服务来创建的,在SurfaceFlinger服务内

abwbw的博客 786

编码surface android,android – 将位图帧渲染到Surface进行编码

我的目标是接收M4V视频文件,将视频片段解码为PNG帧,修改这些帧,并重新编码修剪后的视频(也转换为M4V).工作流程如下:[输入视频] – >导出框架 – >修改框架 – >编码帧 – > [输出视频].对于解码过程,我一直在参考bigflake示例.使用ExtractMpegFramesTest示例代码,我能够从.m4v文件生成位图帧并将帧导出为PNG文件.现在我正在尝...

weixin_42310267的博客 549
上一篇: android Surface(1, 2)
白萝卜。
博客等级 码龄11年 28粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值