皮皮网
皮皮网

【aspx区块链源码】【c#功能源码】【组织架构图+源码】变态辅助源码_变态辅助源码怎么用

时间:2024-12-28 18:58:04 来源:设计app源码网站

1.手游辅助软件排行
2.下载工具有哪些?最好说5个以上
3.汇编语言汇编中怎么嵌入、变态变态运行机器码?
4.Android性能优化:定性和定位Android图形性能问题——以后台录屏进程为例

变态辅助源码_变态辅助源码怎么用

手游辅助软件排行

       1. 手游盒子

        手游盒子是辅助辅助专为手游玩家打造的一款手游辅助软件。该APP提供海量变态版、源码源码用破解版、变态变态修改版游戏资源,辅助辅助并赠送充值卡礼包,源码源码用aspx区块链源码拥有满级VIP权限。变态变态游戏支持玩家自定义,辅助辅助福利礼包每天赠送,源码源码用海量金币注册即得。变态变态该盒子游戏资源丰富、辅助辅助种类繁多,源码源码用是变态变态玩家下载游戏的首选。

       2. 手机玩游戏盒子

        手机玩游戏盒子为客户提供全新的辅助辅助破解游戏,包括热门、源码源码用好玩的各类破解游戏,以及BT、满VIP游戏。游戏上线还赠送充值卡礼包,为玩家提供一个完美的开局。此外,还提供多种游戏类型,如角色扮演、益智休闲、动作等,并已破解为无限金币、钻石、金钱、生命、内购修改的大量游戏资源下载。玩家还可以在论坛上与其他玩家交流心得体会,是玩游戏的最佳选择。

       3. 公益手游盒子

        公益手游盒子专注于为游戏玩家提供高质量、有趣、有情怀的手游产品。该盒子聚集了大量游戏资深玩家和游戏专业人士,实现了玩家贡献内容和玩家服务玩家的模式,使玩家不再孤单玩游戏。

       4. 变态版游戏盒

        变态版游戏盒是一款靠谱的游戏平台,汇聚了当前市面上热门的各类满V游戏、变态游戏、GM权限手游、折扣手机游戏和H5手机游戏。游戏福利超高,充值返利,为玩家提供最优质的服务。玩家无需氪金,上线即送满级VIP、无限元宝等超高福利,让玩家在游戏中领先一步。

       5. 折扣手游盒子

        折扣手游盒子能帮助玩家找到当前最好玩的手游,提供最有趣的内容。游戏种类丰富,每款游戏都有相应的礼包和福利。众多热门好玩的游戏都将出现,上线就送满VIP福利特权,享受土豪的待遇。

       6. 游戏盒子

        游戏盒子提供数十万游戏资源下载,是打造最为优质的手机辅助工具。众多好玩的手游一网打尽,玩家可以免费下载。BlackBox是一款虚拟引擎,可以在Android上克隆、运行虚拟应用,c#功能源码拥有免安装运行能力。黑盒可以掌控被运行的虚拟应用,免Root支持使用XP模块,并且Xposed已粗略过检测。

       游戏蜂窝辅助挂机软件

        1. 打开手机浏览器,输入游戏蜂窝,点击搜索。

        2. 选择游戏蜂窝手游脚本,点击打开。

        3. 进入官网后,点击安卓版下载。

        4. 下载安装完成后,打开在其他应用上层显示的开关。

        5. 进入游戏蜂窝后,点击免Root脚本。

        6. 点击添加辅助,选择要添加的游戏。

        7. 添加好后,点击想要玩的游戏,登录并注册即可。

       万能游戏辅助器脚本推荐

        最新的脚本开发工具——TC,简单易用,无需编程基础即可编写脚本。支持中文和英文编程,未被游戏公司屏蔽和检测。

       棋牌透视挂的实现

        制作棋牌透视挂需要服务器修改源码,以实现透视等功能。

下载工具有哪些?最好说5个以上

       迅雷5、web迅雷、QQ超级旋风、BT等。

       最快的下载工具应该是Internet Download Manager

       这个软件(简称IDM)我试用了几天,下载的速度的确十分惊人,完全超越了以前的那些下载软件,现在可以在网上搜索到它的汉化版,大小在1M左右。

        官方介绍

       提升你的下载速度最多达5倍,安排下载时程,或续传一半的软件。Internet Download Manager的续传功能可以恢复因为断线、网络问题、计算机当机甚至无预警的停电导致下传到一半的软件。此程序具有动态档案分割、多重下载点技术,而且它会重复使用现有的联机,而不需再重新联机登入一遍。聪明的in-speed技术会动态地将所有设定应用到某种联机类型,以充分利用下载速度。 Internet Download Manager支持下载队列、防火墙、代理服务器和映摄服务器、重新导向、cookies、需要验证的目录,以及各种不同的服务器平台。此程序紧密地与Internet Explorer和Netscape Communicator结合,自动地处理你的下载需求。此程序还具有下载逻辑最佳化功能、检查病毒,以及多种偏好设定。

       网友说明

       本人实在不想卖弄但是见大家都用不了,其实我也听一个朋友讲的,赢政早有人这么做了首先说一下IDM 检查注册信息是组织架构图+源码否合法是通过IDM 的官方站点即www.internetdownloadmanager.com来检查注册信息是否合法的,绝大部分算出来的号都会被封掉,一般第一次可以第二次就提示……最多也就用几天,现在就很明显了,只要我们把IDM 的官方站点屏蔽掉就可以无限试用了,且再也不会提示说非法用户了,但是有一个缺点就不是不能升级,我从4.to4.也是这样搞的 4. 卸掉,装4.破解方法一样,大概IDM 的更新时间是两个月,我个人认为这样比那种天注册的一次好,有新版,down下来装新版其实都一样

       另外:

       名称 软件简介 更新时间 大小

       迅雷(Thunder)

       迅雷是一款新型的基于多资源超线程技术的下载软件,作为“宽带时期的下载工具”,迅雷针对宽带用户做了特别的优化,能够充分利用宽带上网的特点,带给用户高速下载的全新体验! -- KB

       BitComet

       BitComet是基于BitTorrent协议的p2p文件分享免费软件,支持多任务下载,文件有选择的下载;磁盘缓存,减小对硬盘的损伤;只需一个监听端口,方便手工防火墙和NAT/Router配置;在WindowsXP下能自动配置支持Upnp的NAT和XP防火墙,续传做种免扫描,速度限制等多项实用功能,以及自然方便的使用界面。 -- 2.5M

       BitComet

       BitComet是基于BitTorrent协议的p2p文件分享免费软件,支持多任务下载,文件有选择的下载;磁盘缓存,减小对硬盘的损伤;只需一个监听端口,方便手工防火墙和NAT/Router配置. -- 3.1M

       Thunder 迅雷

       “光速般”的智能下载软件——迅雷。迅雷拥有比目前用户常用的下载软件快7——倍的下载速度…… -- 3.M

       TuoTu 脱兔

       脱兔Tuotu是首款同时支持BT、ED2K(eMule)、HTTP、FTP、MMS、RTSP协议的高性能绿色P2SP下载软件。 -- 1.M

       Free Download Manager

       一款免费的多点续传下载及管理的软件,支持 HTTP, HTTPS and FTP 的下载功能,软件公司称可增快你的下载速度达 %。该软件有一个特色,支持直接浏览 FTP 站台的目录(如果你有该 FTP 站台的浏览权限时),再选择你要的文档,便可以直接以该软件来下文档。 -- 1.M

       µTorrent(超小BT客户端)

       BT下载你试过µTorrent吗?余KB的BT下载客户端 -- K

       Azureus for Windows

       一个基于JAVA的多torrent下载程序,可以手动设置某个torrent的优先权,加入了irc聊天室,增加了一些基本的irc命令…… -- KB

       影音嗅探专家

       在线电视**地址/Flash/MP3/Email地址/FTP 等网络地址嗅探工具,并可以自定义嗅探文件…… -- KB

       影音传送带(Net Transport) UNICODE

       影音传送带是一个高效稳定功能强大的下载工具,下载速度一流,CPU占用率低,尤其在宽带上特别明显;内建易于使用的文件管理器,轻松实现按类别存放下载的文件…… -- KB

       屁屁狗

       屁屁狗是一款集成HTTP和P2P下载为一体的高速P2SP下载软件…… -- 3.MB

       eMule-Xtreme

       近期国外热门的eMule修改版软件,用骡子的朋友不妨试试这个eMule-Xtreme,在使用这款电骡时发现即使断线重新启动电骡,也不会重新排队…… -- KB

       共工BT

       一个功能强大,使用方便的BitTorrent客户端。拥有全中文的界面,相对于原版更加易用…… -- KB

       影音传送带(Net Transport) ANSI

       影音传送带是一个高效稳定功能强大的下载工具,下载速度一流,CPU占用率低,尤其在宽带上特别明显;内建易于使用的文件管理器,轻松实现按类别存放下载的文件…… -- KB

       uTorrent

       很小巧的BT客户端程序,拥有常见的功能,但是c#博客网站源码不支持UDP的连接协议。内网下载方面也有不错的表现,外网就更不用提了…… -- KB

       TuoTu脱兔

       脱兔是一款优秀的下载软件,目前整合了HTTP、FTP和BT协议,采用的是多镜像多线程下载,支持断点续传。采用多镜像多线程下载的最大优势在于能有效提高下载速度、有些解决下载链接失效情况导致不能下载的问题…… -- KB

       网络搜图王

       帮助你从网页中搜索,并将保存在本地的工具。她可以设置下载的大小:只下载满足大小的到本地…… -- KB

       网络**王

       不管你之前是否有下载过**,现在你选择了网络**王,那么你就不需要再盲目的寻找影片的下载地址了,也不需要用Bt下载到的时候发现没有种子…… -- KB

       BitTorrent

       BitTorrent(简称BT,俗称BT下载、变态下载)是一个多点下载的源码公开的P2P软件,使用非常方便,就像一个浏览器插件,很适合新发布的热门下载。其特点简单的说就是:下载的人越多,速度越快…… -- KB

       HXWare软件传送带 装机必备版

       一款集软件、游戏、Flash搜索和下载的免费工具,您可以使用本软件直接下载您想要的软件、游戏、Flash等,并结合DUDU加速器高速下载。本程序目前收集了约个装机必备软件,不断更新中…… -- KB

       DuDu下载加速器

       软件特性:DuDu下载加速器是基于HTTP/FTP协议开发的多点对等网技术的下载软件产品…… -- 2.3MB

       图像下载 ImageZ

       ImageZ是 Maxthon(遨游) 浏览器的一个扩展插件,可用于遨游Maxthon 1.2.5以上的版本…… -- KB

       CoCsoft Stream Down

       一个非常出色的流媒体文件下载工具. 除HTTP, FTP外, 还支持RTSP, MMS, MMSU, MMST协议! -- KB

       ReGet Pro

       支持HTTP与FTP续传,内建5种语言,可依你的需要来切换.可设定/储存下传文件名单,万一FTPServer接不通,ReGet会一直会试下传文件直到完成为止…… -- KB

       GetRight Pro

       GetRight 将文件下载功能扩展成能恢复中断的下载,简单错误恢复,还有其他很多功能让你更快更灵活下载…… -- KB

       BitComet

       BitComet是基于BitTorrent协议的p2p免费软件;高效的网络内核,多任务同时下载依然保持很少的CPU内存占用…… -- KB

       吸血鬼

       吸血鬼是一款从网站上下载的共享软件,它可以把网站上的都下载下来…… -- KB

       影音传送带(Net Transport)

       《影音传送带》(Net Transport) 中国第一个实现MMS(多线程)、RTSP(PNA)、HTTP和FTP的下载利器…… -- KB

       影音传送带(Net Transport)

       Net Transport 是一个快速稳定功能强大的下载工具。优点:下载,速度一流,CPU占用率低,尤其在宽带上特别明显…… -- KB

       迅雷(Thunder)

       迅雷是一款新型的基于多资源超线程技术的下载软件,作为“宽带时期的下载工具”,迅雷针对宽带用户做了特别的优化,能够充分利用宽带上网的特点,带给用户高速下载的全新体验!同时,迅雷推出了“智能下载”的全新理念,通过丰富的智能提示和帮助,让用户真正享受到下载的乐趣…… -- KB

       阿春保存及浏览器

       本软件为一集的保存及浏览的一个工具。对于一些自己特别喜爱、珍贵或者隐密的,可用此程序来保存,以达到保存和保护的作用…… -- KB

       μTorrent

       μTorrent 是一款体积超迷你的 BT 下载工具,整个安装包甚至连 K 都不到,由此可见它在体积上与那些动辄数 MB 的 BT 下载工具的差异…… -- KB

       BT发动机

       一个优化BT类文件下载速度的软件,在下载BT文件时将BT发动机打开,可以使 计算机处于优化模式,将BT文件下载速度提高%左右,同时可以有效的保护硬盘. -- KB

       Download Accelerator Plus

       相当不错的下载软件,网上下载加速 %,支持文件续传,多线程下载,服务器镜射... -- KB

       μTorrent 汉化版

       一个小巧的BT客户端工具。支持多任务下载;智能化的带宽控制;最小到文件级的下载优先级控制…… -- KB

       Internet Download Manager

       提升你的下载速度最多达5倍,安排下载时程,或续传一半的软件…… -- KB

       随愿专利下载器(PatentDown)

       本人因药品研发的需要,经常要查询一些数据库,如:CNKI中文期刊数据库、中国优秀博硕士学位论文全文数据库、维普数据库、万方数 据库等等…… -- KB

       多线程批量下载机器人(HDLD)

       批量下载功能这是杂志在线阅读+源码最基本功能了,可以通过编写URL地址中的变量实现批量下载,尤其是用来搜集离线论坛是最理想的工具了。批量下载功能目前版本已经包含了poser; GPU; OpenGL;

发现、定性与定位FPS

       计算FPS的方法和工具 Android框架层通过hwui配合底层完成渲染。该框架本身提供了逐帧渲染分段耗时记录。通过dumpsys gfxinfo可以获取。

io.microshow.screenrecorder/io.microshow.screenrecorder.activity.MainActivity/android.view.ViewRootImpl@6b9b8a9?(visibility=0)DrawPrepare?Process?Execute3...................1................

       使用工具统计帧率与平均耗时(同时打印GPU负载),在开启后台录屏的情况下滑动屏幕,平均渲染耗时高达~ms,超出.ms一倍,导致帧率仅帧,显著低于帧。

Average?elapsed?.?msFPS:??│?9.?0.?.?2.#?GPU负载?LOADING?BLOCKING?IDLE?0?#?case的对比——未开启后台录屏Average?elapsed?9.?msFPS:??│?1.?0.?5.?1.

       通过gfx柱状图直观感受性能数据 直观地感受图形渲染性能,除了帧率感受、触控延时外,还可以通过将gfxinfo的分段耗时通过柱状图展示在屏幕上。

       这是case性能问题的gfxinfo柱状图,可以看到红柱和绿柱都非常高,远远超越了流畅标准。其中,绿柱异常放大表明两个Vsync之间耗时显著增长,红柱异常放大表明应用层应用加速使用的DisplayLists大量增长、或图形层使用GLES调用GPU耗时显著增多导致的GPU执行绘制指令耗时变长。

初步定位问题

       本节记录初步的分析思路和定位过程。首先我们完成实验(启停后台录屏并滑动屏幕触发渲染)、观测以及记录,拿到了后台录屏启停情况下的FPS、分阶段耗时以及GPU负载(相关数据位于FPS小节)。

       开发的工具输出的统计数据计算结果非常直观,一眼可见,后台录屏为Draw阶段带来额外的~8倍或~8ms耗时,给Process阶段带来额外的~2倍或~ms耗时。帧率从帧坠落到~帧。

       耗时分析 可以看到,主要的额外耗时来自Draw和Process。接下来重点围绕着两part定位问题问题。

StageDescriptionCompDraw创建DisplayLists的耗时。Android的View如果支持硬件加速,绘制工作均通过DisplayLists由GPU绘制,可以处理为onDraw的耗时额外~8ms或~8倍Prepare准备没有额外耗时ProcessDisplayLists执行耗时。即硬件加速机制下提交给GPU绘制的工作耗时额外~ms或~2倍ExecuteFramebuffer前后缓冲区flip动作的耗时,上屏耗时额外不到~1ms

       Hz下,上述4个步骤合计耗时小于.ms为正常情况。case为~ms。主要增量来自Draw和Process。

       经过上述初步分析、观测后,接下来的分析可以围绕Draw和Process开展。由于Android Draw部分涉及较广,包含App 渲染线程(DisplayLists)、UI线程(onDraw方法创建DisplayLists),以及图形栈耗时如SurfaceFlinger、RenderEngine等都可能增加Draw耗时。

       这里一个技巧可以初步判断耗时来自App进程(渲染线程和UI线程)还是来自图形栈。如果能判断耗时来自App或图形栈,那么可以缩小分析范围、减少分析工作量。上述四大阶段的耗时统计分类比较宽,实际上还有更详细的分阶段耗时,它呈现在前文描述过的gfx统计信息柱状图上。gfx柱状图会以蓝色(RGB(,,))呈现onDraw方法创建和更新DisplayLists的耗时。如果case与正常情况对比后,这部分耗时(蓝柱大小对比)差异很小,即可说明额外的Draw耗时不是来自App的,极可能来自图形栈。Besides,结合过度绘制分析,判断case与正常情况下是否有更多的额外绘制次数可以协同判断。

       ——根据上述指导思想,排查出了case的额外Draw耗时与App onDraw无关,多出来的DisplayLists来自App以外的进程,可能是图形栈如SurfaceFlinger。

定性问题

       本小节介绍问题追踪过程,通过一些方法定位到各阶段的耗时原因,并定性地得出case性能问题的性质。从本小节开始,围绕Perfetto进行分析。这里贴出perfetto的总览,我将关键的信息排序到顶部。前四行分别为SF负责图形的线程、提交到GPU等待完成的工作、Vsync-App、Vsync-sf,最后两行为case中出现卡顿掉帧的App的主线程(UI)和渲染线程(RenderThread)。

跟不上旋律节奏的VSYNC

       容易看到,Vsync-sf非常不规律。Vsync-sf是触发SurfaceFlinger一次合成工作的基于Hardware VSYNC虚拟出来的一个信号。它相对于真实硬件信号(HW_VSYNC)一个规律的偏移(在case设备上,Vsync-app与Vsync-sf都被配置为8.3ms,即硬件VSYNC到达后,虚拟的Vsync-app和Vsync-sf延时8.3ms后发出,分别触发App绘制、SurfaceFlinger合成。

       而case的Vsync-sf交错、残次、不齐、无规律,显然工况不佳。它将导致SurfaceFlinger不能按照预期的时间间隔将合成的帧提交到Framebuffer(经过Flip后,被提交的Framebuffer将上屏成为显示器的下一帧图像),出现掉帧/丢帧。

       As we can see,case的VSYNC-sf出现严重的漂移(见图,第二行的VSYNC-sf残次不齐、跟不上规律、难看且混乱),这导致了丢帧。(但VSYNC-sf的失控仅表示与丢帧的相关性,并不直接表明因果性。)

       VSYNC-sf为什么会出现偏差? 出于功耗的考虑,VSYNC-sf合VSYNC-app并不是一定会触发的。如果app或sf并没有更新画面的需求,那么死板固定地调度它们进行绘制和合成是不必的。编程上,负责触发VSYNC-sf和VSYNC-app的两个EventThread会在requestNextVsync调用后才会将下一个VSYNC-sf或VSYNC-app发出。因此,当(各自EventThread的)requestNextVsync没有调用时,VSYNC-app和VSYNC-sf也就出现漂移。BufferQueueLayer::onFrameAvailable会在应用提交后调用,该方法通过调用SF的signalLayerUpdate触发产生下一个VSYNC-sf。

       换而言之,出于功耗,或别的什么原因(比如耗时导致的延期,人家是线程实现的消息队列),SurfaceFlinger的SFEventThread有可能不调用requestNextVsync,这将导致Vsync-sf在窗口期内短暂消失——但是也不会出现参差不齐的情况。结合case的VSYNC信号报告来看,VSYNC-sf信号异常切实地提示了性能问题——它的不规律现象表明前后Vsync之间有异常耗时,而非低功耗机制被激活或无屏幕刷新(case性能问题复现时一直在滑前台应用的屏,它每ms都有画面更新的需求)。

       VSYNC-sf虽然出现了偏差,但是它与卡顿问题仅有相关性(或者说它是性能问题的结果),并非因果关系。猜测是其他卡顿问题导致了SF延缓了对VSYNC的request,导致其信号出现漂移。VSYNC-sf信号偏差实质上指导意义重大,因为它能提示我们,问题发生在比App更底层的地方(前文分析的结论),且比SurfaceFlinger提交到Framebuffer更上层的位置(VSYNC-sf用于触发合成,合成完成后提交到屏幕双缓冲区)。

       这样,将case性能问题的上下界都确定了,问题分析范围从原先的整个图形栈,有效的缩小到了SurfaceFlinger渲染和合成阶段了。

严重异常耗时的dequeueBuffer

       通读Perfetto,可以看到,出了难看的Vsync-sf以外,还可以看到刺眼的超长耗时的draw(App UI线程)以及耗时变态长的dequeueBuffer(App 渲染线程)调用。相对于正常情况,perfetto报告提示的case的draw方法成倍增长的耗时非常容易被误认为耗时“居然来自一开始就排除掉的App进程",这与前文提出的”问题范围“是不能自洽的——它们是相反的结论,肯定哪里不对。仔细分析才能发现,draw方法确实是消耗了更多墙上时间(但是不意味着消耗了更多CPU时间,因为等待过程是sleep的),但是draw方法是因为等待渲染线程的dequeueBuffer造成的耗时,而dequeueBuffer的严重异常耗时却是被底层的图形栈拖累的。

       我们看到,draw严重耗时,渲染线程dequeueBuffer消耗掉~ms的时间。As we all known,Android的Graphics buffer是生产者消费者模型,当作为消费者的SF来不及处理buffer并释放,渲染线程也就需要额外耗时等待buffer就绪。上面还有一段"Waiting GPU Completion"的trace没有贴上来(下图),这段耗时比不开启后台录屏的case下高得多(~3ms对比~ms),说明了一定的GPU性能问题或SF的性能问题,甚至有可能是Display有问题(HWC release耗时过长也会导致SF释放buf、生产者渲染线程dequeueBuffer额外等待)。

       这里的机制比较复杂,不熟悉底层Graphics buffer的流水线模型就不好理解。In one world, dequeueBuffer申请的buffer不是凭空new出来的,而是在App-SurfaceFlinger-Framebuffer这一流水线中循环使用的。流水线中的buffer不是无限的,而是有穷的几个。当底层的伙计,如SF和HWC,使用了buffer但是没有来得及释放时(它们的工作没做完之前不会释放buffer),流水线(可以理解成头尾相接的单向队列(ring buffer))没有可用的buffer,此时dequeueBuffer就不得不进入等待,出现耗时看上去很长的问题。实际上,dequeueBuffer耗时的唯一原因几乎仅仅只有一个:底层消费太慢了,流水线没有剩余buffer,因此需要等待。

       这个模型抽象理解非常简单。下图,右边消费者是底层图形栈——它每消费完一个buffer就会释放掉,每释放一个buffer应用层能用的buffer就加1。左边生产者是App渲染线程——它调用dequeueBuffer申请一个buffer以将它的画面绘制到这个buffer上。buffer送入BufferQueue后由右边的消费者(图形栈)进行消费(合成、上屏显示),然后释放buffer。当图形栈来不及release buffer时,dequeueBuffer的调用者(App渲染线程)将由于无可用buffer,就必须挂起等待了,在perfetto上就留下长长的一段”耗时“(实际上是墙上时间,大部分都没有占用CPU)。

       以上,这就是为什么说App渲染线程dequeueBuffer严重耗时中的耗时为什么要打引号,为什么要说是被图形层拖累了。

       下图可以看到,刨去dequeueBuffer的严重异常耗时,执行渲染的部分耗时相对于正常的case几乎没有差异,这可以断言渲染线程的惨烈耗时主要就是被dequeueBuffer浪费了。

       从GPU Completion来看,此时GPU正在为SF工作,因为在图中看到(不好意思没有截全,下图你是看不出来的),dequeueBuffer总是在SF的GPU Completion结束之后结束的,这就表明SF正在通过GPU消费buffer(调用GPU进行合成后提交,然后标记buffer允许被渲染线程dequeue)。dequeueBuffer获取到就绪的buffer此时此刻取决于SF的消费能力——因为case中它是短板。(当然图形层的buffer可用不止SurfaceFlinger需要释放,因为SF释放后buffer实质上流转到更底层的HWC,等它将Buffer提交到屏幕后才会释放,这里释放后才能给App再次使用(上面哪个模型图把SF和HWC合并为流水线的图形层buffer消费者)。

       从perfetto报告看HWC release非常及时、余量充足,SF的GPU Completion则较紧密地接着dequeueBuffer返回,基本断言是SF太慢了——排除HWC的责任。(下图看不出来,当时没有截图到HWC的release情况。)

       到这里,除了再次确认排除了前台App的问题外,还可以断言问题来自SurfaceFlinger过分耗时。此外将问题范围的下界从整个SF合成流程(上文的Vsync-sf)缩小到了排除HWC的范围。

       结论:渲染耗时一切正常,问题出现在SF消费buffer(合成图形)失速了,导致没有可用的buffer供渲染线程使用。从下图的SF的工况(第三列)来看,情况确实如此。

       既然一口咬定是SF的锅,那就瞧瞧SF。先看SF的INVALIDATE,这没啥好看的,异常case和正常case都是~2.5ms。主要看refresh,正常case ~6.8ms,异常case ~.8ms。refresh包含SF的合成四件套,包括rebuildLayerStack、CalcuateWorkingSet、Prepare、doComposition。Perfetto报告直接表明,case的后台录屏导致的额外一次合成和配套工作是主要的耗时增量。

       之所以会执行两次合成,是因为后台录屏工具编程上通过Android SDK提供的MediaProjection配合VirtualDisplay实现一个虚拟的镜像的屏幕。SurfaceFlinger会将画面输送一份到这个虚拟的Display以实现屏幕图像传送到录屏工具,虚拟的屏幕要求额外的一次合成。从上图可以直接得出结论,case带来的额外工作消耗就是对该录屏用的VirtualDisplay的合成工作(doComposition)带来的。

VirtualDisplay合成耗时

       由于问题范围已经缩小到了很小的一个范围,在SurfaceFlinger的Refresh过程中,case相对正常应用有巨大的差异耗时,几乎完全来自于对VirtualDisplay的合成耗时(doComposition)。同时也可以看到,两次合成(一次是设备的物理屏幕,一次是case的后台录屏工具创建的虚拟屏幕)中,虚拟屏幕的耗时远远高于物理屏幕(4倍以上)。

       通过查看ATRACE的tag(上图,Perfetto中SurfaceFlinger中主线程的各个trace point都是用ATRACE打的tag),结合dumpsys SurfaceFlinger,能直接看到的线索是:

       虚拟屏显著耗时,且合成工作通过GLES调用GPU完成

       物理屏合成耗时很小,它通过HWC合成

       结合图中提示的trace tag、耗时,可以得出结论,使用GPU合成的虚拟屏中因GPU合成耗时很长,导致它显著高于物理屏HWC合成耗时。如果GPU合成能够和HWC合成一样快,或者干脆让虚拟屏也使用HWC合成,那么可以预期SurfaceFlinger的合成工作的消耗将显著降低。

结论

       本小节综合上述三个小节的分析,对节”定性问题“下一个结论。

       耗时的本质已经被看透,录屏工具申请创建的VirtualDisplay没有通过HWC进行合成,而是通过GPU进行合成,它耗时很长导致界面卡顿。In one word,case使用的VirtualDisplay的合成方式不够高效。

       HWC是Hardward Composer。它接收图形数据,类似于往桌面(真的桌面,不是电脑和手机的桌面)上面叠放照片和纸张——即合成过程。这个工作能将界面上几个窗口叠加在一起后送到屏幕上显示。通过GLES调动GPU也能干这活,不过HWC执行合成的动作是纯硬件的——它很快,比GPU快几倍。

定位问题

       前面虽然定性了问题原因是合成方式不够高效,但是没有得出其中的原理——为什么虚拟屏不使用高效的HWC进行合成。本节通过介绍HWC的原理、SurfaceFlinger控制合成方式、虚拟屏Surface特性等来介绍图形栈中合成方式的处理模式。掌握了相关管理后,探讨一些尽量通用的共性的解决方案实现性能优化。最后着重介绍多套优化方案中的一种直面根本原因的解决方法——MediaCodec.MediaFormat创建的支持HWC合成的Surface方案。

       SurfaceFlinger如何决定使用HWC还是GPU合成? SurfaceFlinger合成主要可以依靠两条路径。其中之一是”纯硬“的HWC合成(在dumpsys SurfaceFlinger中可以看到Composition type为DEVICE),另一个是通过OpenGL让GPU进行合成(Composition type为CLIENT)。

       除非是功耗上的设计,否则SurfaceFlinger总是会优先检查本次合成是否支持使用HWC。编程上,在合成阶段之一的prepare过程中,SurfaceFlinger通过prepareFrame在RenderSurface与Hardware Composer(即HWC)的HIDL服务通信,完成hwc layer的创建。但是,layer能够成功创建不意味着一定支持HWC合成。SurfaceFlinger通过getChangedCompositionTypes向HWC查询不支持HWC合成的Layer。该方法返回的layer如果被标记为CLIENT合成,那么这部分Layer无法由HWC进行合成,而只能通过GPU进行合成——case的VirtualDisplay就是这个情况。

       部分layer可能不能由HWC合成的原因(除功耗策略、其他软件策略外):

       HWC layer达到上限 Hardware Composer支持的layer数量是有限的。查阅公开资料可知,HWC合成动作属于硬件提供的能力,它们的合成能力受到硬件本身的限制。Google官方资料对Android设备的要求是,HWC最少应该支持4个Layer,分别用于一个常规页面上最常见的4个层:壁纸、状态栏、导航栏和应用窗口。 在case设备中,经过测试,该平台的HWC最多支持7个能进行HWC合成的layer,从第8个layer开始,完完全全只能使用CLIENT合成亦即SurfaceFlinger调用RenderEngine通过OpenGL调动GPU进行合成。 正是由于HWC合成layer有上限,因此在弹出多个弹窗、叠加过于复杂时,即使界面简单也有可能出现比较明显的卡顿。

       VirtualDisplay的Surface格式不受HWC支持 HWC的硬件合成能力对buffer(Surface封装)内保存的图像的格式有要求。比如,HWC不能处理缩放,仅支持一部分的格式,大多数都还有其他因素会导致不支持,如旋转、部分Alpha等等。In one word,图像格式的数量是远远多于HWC支持的类型数的。当HWC碰到不支持合成的Surface时,就会在前文提过的getChangedCompositionTypes中通知SurfaceFlinger,由SurfaceFlinger转为使用GPU合成。

       结合上述几种情况,设计实验验证。其中通过在物理屏上弹窗来增加Layer以获取HWC Layer上限。确认case无法使用HWC合成不是Layer上限导致的问题后,通过对比来验证Surface格式问题。Surface是对native层的buffer的封装,其类型广泛、实现复杂,一个一个试是不现实的。通过对比性能强劲的类似实现可以一探究竟。Android adb提供一个出厂自带的录屏命令screenrecord、用于测试双屏显示功能的虚拟辅助屏幕(开发者模式-模拟辅助屏)、著名远程窥屏工具scrcpy等三个工具是一系列重要参考。

       经过测试,screenrecord和scrcpy创建的VirtualDisplay支持HWC合成——这是优化目标。首先看看它们的实现。

       编程上,虚拟辅助屏幕采用了与case一模一样的实现——通过创建VirtualDisplay让图形层额外合成一次屏幕到该虚拟屏幕中。虚拟屏幕本质上将画面发送给录屏功能实现,而非进行显示来完成录屏。

       通读screenrecord源码,逻辑上,它与虚拟辅助屏、case录屏应用是相同的——VirtualDisplay录屏。但是编程上略有差异:

       screenrecord直接通过binder与SurfaceFlinger通信,获取了raw VirtualDisplay,而

更多内容请点击【焦点】专栏