1.电脑操作系统常见的源码电脑操作系统有哪些
2.金鹏山寨机A2898是什么平台
3.探寻oppoa7x处理器的性能与特点
4.Android性能优化:定性和定位Android图形性能问题——以后台录屏进程为例
电脑操作系统常见的电脑操作系统有哪些
‘壹’ 主流的电脑操作系统都有哪些1、Windows系列操作系统
Microsoft Windows 系列操作系统是源码在微软给IBM机器设计的MS-DOS的基础上设计的图形操作系统。现在的源码Windows系统,如Windows 、源码Windows XP皆是源码建立于现代的Windows NT内核。NT内核是源码江湖洗车 源码下载由OS/2和OpenVMS等系统上借用来的。Windows 可以在位和位的源码Intel和AMD的处理器上运行,但是源码早期的版本也可以在DEC Alpha、MIPS与PowerPC架构上运行。源码 虽然由于人们对于开放源代码作业系统兴趣的源码提升,Windows的源码市场占有率有所下降,但是源码到年为止,Windows操作系统在世界范围内占据了桌面操作系统%的源码市场。Windows系统也被用在低阶和中阶服务器上,源码并且支持网页服务的源码数据库服务等一些功能。最近微软花费了很大研究与开发的经费用于使Windows拥有能运行企业的大型程序的能力。
2、Unix类操作系统
如SOLARIS,BSD系列(FREEBSD,openbsd,netbsd,pcbsd);Unix系统可在非常多的处理器架构下执行,在服务器系统上有很高的使用率,例如大专院校或工程应用的工作站。自由软件Unix变种,例如Linux与BSD近来越来越受欢迎,它们也在个人桌面电脑市场上大有斩获,例如Ubuntu系统,但大部分都是电脑高手在使用。某些Unix变种,例如HP的HP-UX以及IBM的AIX仅设计用于自家的硬件产品上,而SUN的Solaris可安装于自家的硬件或x电脑上。苹果电脑的Mac OS X是一个从NeXTSTEP、Mach以及FreeBSD共同派生出来的微内核BSD系统,此OS取代了苹果电脑早期非Unix家族的Mac OS。经历数年的披荆斩棘,自由开源的Unix系统逐渐蚕食鲸吞以往专利软件的专业领域,例如以往电脑动画运算巨擘——SGI的IRIX系统已被Linux家族及Plan 9[3]丛集所取代。
3、Linux类操作系统
如UBUNTU,suse linux,fedora,等 ,Linux的是一套免费的位多人多工的操作系统,运行方式同UNIX系统很像,但Linux系统的稳定性、多工能力与网络功能已是许多商业操作系统无法比拟的,Linux还有一项最大的特色在于源代码完全公开,在符合GNU GPL(General Public License)的原则下,任何人皆可自由取得、散布、甚至修改源代码。
4、Mac操作系统
由苹果公司生产(Darwin),一般安装于MAC电脑。苹果Mac OS系列操作系统是苹果公司 (原称苹果电脑)给苹果个人电脑系列设计的OS。
‘贰’ 电脑的操作系统有那些
1、纯DOS系统,包括C-DOS、M-DOS、S-DOS、MS-DOS等。
2、WINDOWS系统,包括WIN7、WIN8、XP、WIN、WIN、WIN等。
3、LINUX系统,包括红帽、红旗、CentOS、Ubuntu等。
4、MAC OSX系统,基于UNIX系统开发,苹果电脑专用系统。
5、chrome os系统,谷歌基本Linux系统开发的开源操作系统。
6、UNIX操作系统,包括AIX、HP-UX、 Solaris 、IRIX、Xenix等。
电脑使用注意事项
建议用户需要注意电脑的上电、关机顺序,开机顺序:先开电源开关,再开显示器,最后开电脑主机。
关机顺序:先关闭所有电脑运行的程序,再关闭电脑主机,look直播源码然后关闭电脑显示器,最后关闭电源开关
不要在带电的情况下插拨任何与主机、外设相连的设备、插头、板卡等,在电脑工作时,不得随意搬动、移动和振动机器。
‘叁’ 电脑操作系统有那些
DOS
windows系列
基于linux内核的各种发行版比如ubuntu
基于unix的系统(严格说来mac
os也是unix、但是很多时候都把mac
os分出来说)
,手机的话有MTK
wm
wp(wm和wp都是MS的)
symbian
android
bada(三星的手机系统)
meego(也有PC版的meego系统)
ios,还有的就记不清了
‘肆’ 电脑操作系统的种类有多少
操作系统的种类
目前操作系统种类繁多,很难用单一标准统一分类。
根据操作系统的使用环境和对作业处理方式来考虑,可分为批处理系统(MVX、DOS/VSE)、分时系统(WINDOWS、UNIX、XENIX、Mac OS)、实时系统(iEMX、VRTX、RTOS,RT Linux);
根据所支持的用户数目,可分为单用户(MSDOS、 OS/2)、多用户系统(UNIX、MVS、Windows);
根据硬件结构,可分为网络操作系统(Netware、Windows NT、 OS/2 warp)、分布式系统(Amoeba)、多媒体系统(Amiga)等。
操作系统的五大类型是:批处理操作系统、分时操作系统、实时操作系统、网络操作系统、分布式操作系统。
1,CP/M其实就是第一个微机操作系统,享有指挥主机、内存、磁鼓、磁带、磁盘、打印机等硬设备的特权。通过控制总线上的程序和数据,操作系统有条不紊地执行着人们的指令。
2,DOS系统是年由微软公司为IBM个人电脑开发的,即MS-DOS。它是一个单用户单任务的操作系统。在年到年间DOS占据操作系统的统治地位。
3,Windows是一个为个人电脑和服务器用户设计的操作系统。它的第一个版本由微软公司发行于年,并最终获得了世界个人电脑操作系统软件的垄断地位。现在的版本有 Win/Win/winMe/Win/Winxp/win等,所有最近的Windows都是完全独立的操作系统
4,Unix是一种分时计算机操作系统,在AT&TBell实验室诞生。从此以后其优越性不可阻挡的占领网络。大部分重要网络环节都是Unix构造。主要是 IBM AIX,SUN Solaris ,HP UNIX。(BSD ·Solaris ·SCO ·HP-UX ·AIX ·AS ·Tru ·IRIX ·MacOsX )个大牌厂商。主要用于电信,银行,证券以及大企业客户。
5,Linux是Unix克隆的操作系统,在源代码上兼容绝大部分Unix标准,是一个支持多用户、多进程、多线程、实时性较好的且稳定的操作系统。主要有 RedHat,SlackWare,SUSE,TurboLinux,Debian,
XteamLinux,BluePoint,红旗Linux等。
6,Palm OS 提起Palmsource公司的产品Palm操作系统,无人不会因为其对掌上电脑发展的推动表示敬意,在硬件还不发达的几年前,反应快速的Palm操作系统几乎是掌上电脑的唯一选择,跟我们常用的windows操作系统一不一样的是,Palm 是利用一个内建、很简单的“程序总管”(application launcher)来呈现你 Palm 上的所有东西。它会显示所有你 Palm 上内建及安装的程序,但它并不会显示数据库档案(可以理解,访问页面源码如果没有和数据关联的软件,这个数据应该也没有任何意义),所以你可以很轻易地找到想要的程序并执行它
还有其它等等。
‘伍’ 现在的电脑操作系统都有哪些
现在经常见到的PC系统
winodws
windows XP
windows VISTA
winodws
linux等
MAC机
MacOS .5
SUN服务器
Solaris
暂时就知道这些了!
‘陆’ 目前电脑操作系统有哪些呢
1、目前电脑操作系统主要有windows系列,dos,mac os系列,linux,unix。
2、区别及好坏具体要看个人使用习惯和对系统的偏好及使用目的。
3、windows系列普通电脑都可以使用,操作比较容易,是最普及最常用的,目前一般使用有windowsxp、windowsvista、windows7、windows8、windows、windows、windows等。
4、dos,命令行界面,想挑战自己的可以试试,不过已经是过去时了。
5、想使用mac os系列,要么很有钱去买苹果的电脑,要么很有耐心和研究精神去钻研怎么在pc上装这个系统。
6、linux和unix看上去差不多,稳定性、安全性非常强,不过虽然有窗口界面,但是命令行也离不了,对使用者要求稍高,使用起来很多人觉得不是很适应,主要是管理员、专业人员及开发人员使用的多。
7、作为个人普通用户来说,应该是windows系统比较好,简单易用;喜欢高消费追求时尚的,就可能觉得苹果电脑及mac os好了,对于数据库管理员,尤其是多用户大型数据库,那就认为最好是UNIX了,或者Linux。
‘柒’ 电脑操作系统有几种各有什么区别哪种系统好
目前电脑主流的操作系统有一下四种:
1.Windows操作系统
2.Unix操作系统
3.Linux操作系统
4.Mac OS操作系统
这四种操作系统各有优劣,没有哪一种更好,请根据需要选用。
‘捌’ 常见的电脑操作系统有哪些
1,Microsoft Windows
Microsoft Windows操作系统是美国微软公司研发的一套操作系统,它问世于年。Windows采用了图形化模式GUI,比起从前的DOS需要键入指令使用的方式更为人性化。
2,Linux
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。
3,Android
Android是一种基于Linux的自由及开放源代码的操作系统。主要使用于移动设备,如智能手机和平板电脑,由Google(谷歌)公司和开放手机联盟领导及开发。
4,iOS
iOS是由苹果公司开发的移动操作系统。苹果公司最早于年1月9日的Macworld大会上公布这个系统,最初是设计给iPhone使用的,后来陆续套用到iPod touch、iPad以及Apple TV等产品上。
5,Mac OS
Mac OS是一套运行于苹果Macintosh系列电脑上的操作系统。Mac OS是首个在商用领域成功的图形用户界面操作系统。现行的最新的系统版本是macOS ..4 ,且网上也有在PC上运行的Mac系统,简称 Mac PC。
‘玖’ 电脑系统有哪些 电脑操作系统大全
1、windows操作系统
windows操作系统是微软公司开发的电脑操作系统,通常用于台式电脑和笔记本电脑中,在用户的使用评价中,对windows操作系统有较高的评价,而且此款系统也是大家最熟悉的电脑系统。之后微软公司还研发了适合服务器的操作系统,像windows server ,windows server ,这些是为了服务器安装的系统,不是应用与台式机电脑中。
2、lua源码记账UNIX操作系统
UNIX基本上都是安装在服务器上,并没有用户界面,都是靠命令操作。所以进入系统后出面的页面,是一个黑乎乎的界面,然后就之后一个光标在闪。没有什么娱乐软件,不能看,不能听歌。
3、linux操作系统
linux操作系统是在UNIX操作系统上跟进的系统,有许多UNIX的的特性,在系统中间加入了一些新的功能,linux操作系统比较适用于linux操作系统,一些相应的软件也可以使用,像是QQ,IE等一些常用的软件等。
4、苹果操作系统
苹果操作系统就是IOS操作系统,也是比较出名的电脑系统了,但是大家不了解的是,IOS操作系统是在UNIX操作系统上开发的。而且有着良好的用户体验,华丽的用户界面和简单的操作,使用更加人性化。
金鹏山寨机A是什么平台
NucleusPLUS嵌入式操作系统
简介
NucleusPLUS是目前最受欢迎的嵌入式操作系统之一。
性能
在典型的目标环境中,NucleusPLUS核心代码区一般不超过K字节大小。NucleusPLUS采用了软件组件的方法。每个组件具有单一而明确的目的,通常由几个C及汇编语言模块构成,提供清晰的外部接口,对组件的引用就是通过这些接口完成的。除了少数一些特殊情况外,不允许从外部对组件内的全局进行访问。由于采用了软件组件的方法,NucleusPLUS各个组件非常易于替换和复用。NucleusPLUS的组件包括任务控制、内存管理、任务间通信、任务的同步与互斥、中断管理、定时器及I/O驱动等。
[编辑本段]特点
Nucleus具有如下特点:
提供源代码
1、提供源代码 NucleusPLUS提供注释严格的C源级代码给每一个用户。这样,用户能够深入地了解底层内核的运作方式,并可根据自己的特殊要求删减或改动系统软件,这对软件的规范化管理及系统软件的测试都有极大的帮助。另外,由于提供了RTOS的源级代码,用户不但可以进行RTOS的学习和研究,而且产品在量产时也不必支付License,可以省去大量的费用。对于军方来说,由于提供了源代码,用户完全可以控制内核而不必担心操作系统中可能会存在异常任务导致系统崩溃。
性价比高
2、性价比高 NucleusPLUS由于采用了先进的微内核(Micro-kernel)技术,因而在优先级安排,任务调度,任务切换等各个方面都有相当大的优势。另外,对C++语言的全面支持又使得NucleusPLUS的Kernel成为名副其实的面向对象的实时操作系统内核。然而,其价格却比较合理。所以,容易被广大的研发单位接受。
易学易用
3、易学易用 NucleusPLUS能够结合Paradigm,SDS以及ATI自己的多任务调试器组成功能强大的集成开发环境,配合相应的编译器和动态联结库以及各类底层驱动软件,用户可以轻松地进行RTOS的开发和调试。另外,由于这些集成开发环境(IDE)为所有的开发工程师所熟悉,因而,容易学习和使用。
功能模块丰富
4、功能模块丰富 NucleusPLUS除提供功能强大的内核操作系统外,还提供种类丰富的功能模块。例如用于通讯系统的局域和广域网络模块,支持图形应用的实时化Windows模块,支持Internet网的WEB产品模块,工控机实时BIOS模块,图形化用户接口以及应用软件性能分析模块等。用户可以根据自己的应用来选择不同的应用模块。
[编辑本段]其他特点
支持类型
NucleusPLUS的RTOS内核可支持如下类型的CPU: x,xxx,HCxx,NECV,ColdFire,K,i,MIPS,SPARClite,TIDSP,ARM6/7,StrongARM,H8/H,SH1/2/3,PowerPC, V8xx,Tricore,Mcore,PanasonicMN,Tricore,Mcore等。 可以说NUCLEUS是支持CPU类型最丰富的实时多任务操作系统。针对各种嵌入式应用,NucleusPLUS还提供相应的网络协议(如TCP/IP,SNMP等),以满足用户对通讯系统的开发要求。另外,可重入的物料替代源码文件系统、可重入的C函数库以及图形化界面等也给开发者提供了方便。针对不同的CPU类型,Nucleus还提供编译器、动态连接库、多任务调试器等相应的工具来配置用户的开发环境。 值得提出的是ATI公司最近还发表了基于Microsoft Developers Studio的嵌入式集成开发环境-NUCLEUSEDE。从而率先将嵌入式开发工具与Microsoft的强大开发环境结合起来,提供给工程师们强大的开发手段。
源代码带来的优势众所周知
Nucleus实时多任务操作系统提供给用户源代码。这除商务上给用户带来巨大益处(免交Royalty)外,还在技术方面给用户极大的方便,即无需编写和调试BSP,从而达到易学易用的目的,加速产品上市。对RTOS有一定知识的工程师一定清楚,使用RTOS最大的障碍在于编写和调试BSP。 大家知道,在调试目标系统的软件之前,必须将目标与主机连接起来并建立通讯。为此,我们可以编写一段监控程序(Monitor)。然而,如果要调试基于RTOS内核的程序,主机上的调试器(Debugger)除要与目标建立通讯外,更重要的是必须识别RTOS的任务,这样才能进行任务级调试(Task-awareDebugger)。因此,只有Monitor是不够的。如果我们选用的RTOS不提供源代码,那么,主机上的调试器(Debugger)就只有通过用户编写的BSP来了解Kernel在现有硬件平台上 对各个任务进行调度的情况。显然,编写BSP必须对CPU目标系统的硬件以及应用软件等有全面而深入的了解。一般说来,对于一个有一定硬件开发经验的工程师来说,编写一个新的BSP要花的平均时间为两个月左右。这对于一个新手来说可是比较困难的。对于编写BSP的工程师来说,另外一个更大的挑战就是如何调试BSP,即如何验证所编写的BSP是否正确。通常刚刚焊接安装好的PCB板中,硬件或软件的故障(Bugs)是比较多的。甚至更常见的是CPU部分都没有运作正常。有时时序错误和总线错误都还存在。在您把写好的BSP烧入EPROM(或FLASH)中试图将目标与主机建立联系时,您几乎%地会发现根本无法通讯,眼前一团漆黑,不知是软件有错误还是硬件不运转。BSP在正常运行吗?不得而知。在焦急和摸索中您可能发现几个月已悄然而过。对于早期的实时操作系统来说,BSP是必由之路。然而,新一代的RTOS-NucleusPLUS则避免了BSP带来的痛苦过程。因为Nucleus的调试是基于全新的动态连接库(DLL)。用户只须通过监控程序(Monitor)或者BDM调试口(或者JTAG调试口)建立目标系统(Target)与主机(Host)之间的通讯,并给主机上的Debugger初始化特性中加入Nucleus的动态连接库(DLLs),这时,调试器就能够自动地去识别运行在目标系统中的Nucleus内核和各个应用任务,从而完成任务级调试。上述的动态连接库(DLLs)是由RTOS厂商和Debugger厂商合作完成的,用户无须自行编写。因此,Nucleus的用户只需要将精力放在基于Nucleus的编程工作中。对于一个新手,往往经过一天到两天的学习和培训,就可以投入到应用程序编制工作中去,无需花大量的时间去研究CPU,特定的硬件等。 另外,由于有了源程序,用户在调试程序时可以清楚地通过STEPINTO命令,追踪到RTOS的内层中去,观看和学习Kernel对任务的管理和调度机制。对于有志研究RTOS深层技术的工程师来说极为方便。对于MotorolaK和PowerPC,用户可以利用GreenHill公司的Mutil调试器或TRACE-ICD来完成NucleusPLUS的调试;对于ARM和StrongARM,用户可以利用ARM公司的SDT调试器或TRACE-ICD来完成NucleusPLUS的调试;对于Intelx实模式,用户可以利用Paradigm公司的调试器及其DLL来进行任务级调试;对于Intelx保护模式则可以利用SSI公司Softprobe调试器和SSIDLL来调试;对于i, SH3/4,ARM6/7,MIPS等芯片,则可以使用ATI公司自己的UDB调试器来进行任务的调试。结论:动态连接库(DLL)是在RTOS工具中新出现的应用趋势,通过这种方式,用户可以免去BSP带来的麻烦,灵活方便地进行开发和调试,大大加速开发进度。 Nucleus实时操作系统提供源代码,支持丰富的CPU种类,配合各类DLL动态连接库,为使用和研究RTOS技术的工程带来极大的利益。进行ARM系列的开发需要大量的设备投入,另外如果做比较大型的系统,还必须要操作系统,购买一个好的操作系统也是需要几十万元。ARM的应用层研发可以建立在C,C++及其他的大多数开发语言上,这对于软件公司来说是很方便的,只要准备好硬件及操作系统,其他的工作就可以分模块给N个人来进行。而对于底层的东西,ARM公司也可以有比较大力度的支持,因此如果需要用ARM系列开发高端产品,可行性是比较高的,开发周期也不会很长。当然,对于arm芯片,还是有一定的限制,比如没有除法指令,这样在编程时就要尽量避免用除法,否则会带来程序代码的增加和执行速度的降低。一般说,除法还是可以通过移位和乘法来代替的。 二、Nucleus博客(Blogs)系统 在Nucleus博客中,您可以设定一个或多个博客(Blogs)。如果您愿意,可以在一个网页中同时显示几个不同博客(Blogs)的内容。
探寻oppoa7x处理器的性能与特点
随着时代的发展,手机处理器的速度与性能对于现代人的生活已经形成了不可忽视的作用。在当前众多手机品牌竞争的市场中,OPPO A7x作为OPPO手机的一款重要产品,其所搭载的MTK P处理器也备受关注。那么OPPO A7x处理器的性能与特点是怎样的呢?下文将从多个方面对其进行探究。 1.处理器基本介绍: 首先,我们先来了解一下OPPO A7x所搭载的处理器:MTK P。这款处理器采用nm工艺,CPU部分由4颗Cortex-A核心和4颗Cortex-A核心组成,其中A主频最高可达2.0GHz。GPU部分采用Arm Mali-G MP3,运行内存支持LPDDR4X,存储接口支持UFS 2.1标准。 2.性能方面表现: 根据测试数据,在实际使用中,OPPO A7x的整体性能表现还是比较出色的。它的AnTutu跑分约为万分,位于中高端水平。在CPU以及GPU的性能表现方面,MTK P处理器能够很好地应对常见应用,对于一些大型游戏也不会出现掉帧问题。 3.功耗表现: 另外,MTK P处理器的功耗表现也相当优秀,其是一款典型的全志式平衡芯片。MTK在目前主流的AI、摄像头技术方面已经有了较为深入的探索,因此在与内存打通、图像算法、信号处理以及AI核心技术的协同协作上也有成熟的表现。这使得OPPO A7x在续航时间上有不错的发挥。 4.其他特点: 摄像方面:MTK P处理器支持+MP的双摄像头,同时还有超清晰图像调节技术,可智能提升拍照画质。 安全保障:鉴于目前网络安全日益凸显的需求,MTK P处理器支持一键加密、源码开放、硬件级别保护等安全保护机制,以确保信息的安全性。 多任务分配:MTK P处理器支持三个LTE基带,集成了一个全新的网路调度技术,可以更好的分配多任务,使得系统变得更加流畅。 总体而言,OPPO A7x所搭载的MTK P处理器作为一款中高端处理器,其表现还是值得肯定的。除了在常规性能方面表现优秀之外,其功耗节省以及多项安全特性也为用户提供了更好的使用保障。相信随着科技的不断进步,手机处理器的性能特点也会越来越先进、完善。Android性能优化:定性和定位Android图形性能问题——以后台录屏进程为例
简介发现、定性与定位
总结
跟不上旋律节奏的VSYNC
严重异常耗时的dequeueBuffer
VirtualDisplay合成耗时
结论
FPS
初步定位问题
定性问题
定位问题
成果展示
参考
简介本文记录一次Android图形性能问题的分析过程——发现、定性和定位图形性能问题,以及探讨的性能优化方案。
环境:Android Q + MTK + ARM Mali-G。
所分析的性能问题(下称case):打开录屏应用并启动后台录屏,滑动前台应用(滑屏)。性能表现差:CPU、GPU负载显著升高、掉帧、用户明显卡顿感,帧率不足帧,帧渲染、合成耗时急剧飙升(渲染耗时平均为ms左右)。
经过优化后,相同环境和条件下,渲染帧率稳定在帧(提升一倍),渲染耗时平均为8.ms左右(为优化前的不到三分之一的消耗)。
关键词 Keywords: Screen Recording; Frame rate; FPS; GPU utilization; Jank; MediaProjection; VirtualDisplay; MediaCodec; Perfetto; Inferno; Surface; SurfaceTexture; VSYNC; SurfaceFlinger; HWC; Hardware composer; 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动作的耗时,上屏耗时额外不到~1msHz下,上述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,而