AndroidSurface之创建流程及软硬件绘制注:本文基于Android10源码,为了文章的简洁性,引用源码的地

当其第一次被使用时会调用如下函数:

一个ViewRootImpl对象对应了一个Surface对象,在其源码中有如下代码:

接下来就到了WindowSurfaceController.getSurface方法:

上面看到了一个IGraphicBufferProducergbp对象,这是一个很重要的对象,我们看一下它是怎么被创建的:

在Java层中ViewRootImpl实例中持有一个Surface对象,该Surface对象中的mNativeObject属性指向native层中创建的Surface对象,native层的Surface对应SurfaceFlinger中的Layer对象,它持有Layer中的BufferQueueProducer生产者指针,在后面的绘制过程中Surface会通过这个生产者来请求图形缓存区,在Surface上绘制的内容就是存入到这个缓存区里的,最终再交由SurfaceFlinger通过BufferQueueConsumer消费者取出这些缓存数据,并合成渲染送到显示器显示。

Resterization:栅格化(光栅化)。栅格化把Button,TextView等组件拆分到不同的像素上进行显示,这是一个很费时的操作,GPU可以加快栅格化的操作。

Android系统的UI从绘制到显示在屏幕上可分为两个步骤:

软件渲染

硬件渲染

判断是否支持硬件加速:

//如果Application、Activity配置了不开启硬件加速,则返回falseview.isHardwareAccelerated()//假如没有设置setLayerType,则受到Application、Activity的影响//假如设置了setLayerType,其返回值则受到setLayerType参数的影响canvas.isHardwareAccelerated()在绘制过程中会通过VRImpl.enableHardwareAcceleration方法去判断是否需要开启硬件加速:

privatebooleandrawSoftware(Surfacesurface,AttachInfoattachInfo,intxoff,intyoff,booleanscalingRequired,Rectdirty,RectsurfaceInsets){//Drawwithsoftwarerenderer.finalCanvascanvas;canvas=mSurface.lockCanvas(dirty);canvas.setDensity(mDensity);try{dirty.setEmpty();mView.draw(canvas);}finally{surface.unlockCanvasAndPost(canvas);}returntrue;}上面的软件绘制可以分成三个步骤:

publicCanvaslockCanvas(RectinOutDirty)throwsSurface.OutOfResourcesException,IllegalArgumentException{synchronized(mLock){if(mLockedObject!=0){//refusetore-locktheSurface.thrownewIllegalArgumentException("Surfacewasalreadylocked");}mLockedObject=nativeLockCanvas(mNativeObject,mCanvas,inOutDirty);returnmCanvas;}}这里调用native方法nativeLockCanvas来获取mLockedObject指针,上面说过mNativeObject指向native层创建的Surface对象。

小结:Surface.lockCanvas方法的作用是通过BufferQueueProducer生产者从BufferQueue队列中取出一个图形缓存区GraphicBuffer(用来创建Canvas中的Bitmap对象)并锁定该Surface,然后将Surface的地址返回给Java层Surface中的mLockedObject属性。

软件绘制可以简单分成以下三个步骤:

BufferQueueProducer中的两个重要函数:

对于软件绘制中的Canvas而言其绘制目标是一个Bitmap对象,绘制的内容会填充到Surface持有的缓存区(GraphicBuffer)里。

voiddraw(Viewview,AttachInfoattachInfo,DrawCallbackscallbacks,FrameDrawingCallbackframeDrawingCallback){finalChoreographerchoreographer=attachInfo.mViewRootImpl.mChoreographer;choreographer.mFrameInfo.markDrawStart();//构建View的DrawOp树updateRootDisplayList(view,callbacks);//通知RenderThread线程进行绘制intsyncResult=nSyncAndDrawFrame(mNativeProxy,frameInfo,frameInfo.length);//...}可以将硬件绘制分为两个阶段:构建阶段和渲染阶段。

publicvoidend(DisplayListCanvascanvas){longdisplayList=canvas.finishRecording();//将displayList缓存到native层的RenderNode中nSetDisplayList(mNativeRenderNode,displayList);canvas.recycle();}RenderNode.end方法用来将displayList缓存到native层的RenderNode中。在updateDisplayListIfDirty方法遍历了子View并将缓存了displayList的RenderNode返回后,ThreadedRenderer通过DisplayListCanvas.drawRenderNode方法将之前返回的RenderNode合入ThreadedRenderer内部的RenderNode中,然后也通过RenderNode.end方法将displayList缓存到native层的RenderNode里。

申请内存

软件绘制申请内存是通过Surface.lockCanvas方法借由BufferQueueProducer取出一个图形缓存区GraphicBuffer。至于硬件加速的内存是怎么申请的可以看看这部分代码(performTraversals方法应该很熟悉了):

可以看到硬件加速请求SurfaceFlinger内存分配的时机会比软件绘制更前,硬件加速这么设计可以预先分配内存,避免在渲染的时候再申请,防止分配内存失败时浪费了CPU之前的构建等工作,另外也可以将渲染线程的工作简化。

渲染线程绑定Surface

接着看一下Render线程是怎么跟目标Surface绘图界面绑定的(因为同一时刻可能有多个Surface绘图界面,它需要绑定一个渲染的上下文),从上面看到申请内存前调用了ThreadedRenderer.initialize方法:

渲染

当渲染线程绑定了Surface,且Surface内存分配以及DrawOp树构建完成后,便可以看一下渲染流程,从上面的nSyncAndDrawFrame方法开始,其实现在Native层:

硬件加速可以从两个阶段来看:

其中硬件加速的内存申请跟软件绘制一样都是借助Layer中的BufferQueueProducer生产者从BufferQueue中出队列一块空闲缓存区GraphicBuffer用来渲染数据的,之后也都会通知SurfaceFlinger进行合成。不一样的地方在于硬件加速相比软件绘制而言算法可能更加合理,同时采用了一个单独的Render线程,减轻了主线程的负担。

软件绘制

软件绘制可能会绘制到不需要重绘的视图,且其绘制过程在主线程进行的,可能会造成卡顿等情况。它把要绘制的内容写进一个Bitmap位图,其实就是填充到了Surface申请的图形缓存区里。

软件绘制可分为三个步骤:

硬件绘制

硬件绘制会将绘制函数作为绘制指令(DrawOp)记录在一个列表(DisplayList)中,然后交给单独的Render线程使用GPU进行硬件加速渲染。它只需要针对需要更新的View对象的脏区进行记录或更新,无需更新的View对象则能重用先前DisplayList中记录的指令。

硬件绘制可分为两个阶段:

硬件加速的内存申请跟软件绘制一样都是借助Layer中的BufferQueueProducer生产者从BufferQueue中出队列一块空闲缓存区GraphicBuffer用来渲染数据的,之后也都会通知SurfaceFlinger进行合成。不一样的地方在于硬件加速相比软件绘制而言算法可能更加合理,同时采用了一个单独的Render线程,减轻了主线程的负担。

源码解析中如有问题欢迎指出,因为有些地方的逻辑我也一知半解,争取查漏补缺修正。用一张图总结一下Android软硬件绘制的流程:

THE END
1.什么是SP文件什么是SP文件更新时间: 2024-11-23 18:45:19 SP是Service Pack的缩写。软每推出一个软件后,都会不定期地推出一些补丁程序。依时间先后称为SP1、SP2等等。后一个SP版本包括前一个版本的全部内容。标签: 安全 生产 管理 包括 主要 方面 什么是SP文件 相关文章...http://m.15tqc.com/show3311144/
2.账无忧第三方财务软件数据导入操作指南(三)以上系统软件需要使用账无忧数据交换工具,登录原系统的数据库读取账务数据进行转换,再导入转换后的XML文件使用 本课程以“金蝶专业版”系统数据导入账无忧系统为例介绍 二、操作流程 首先先确认安装金蝶专业版财务软件的数据库本机电脑,确认方法:在安装金蝶财务软件的电脑上,打开【控制面板】→【管理工具】(如果没有管理...https://vip.kingdee.com/article/343435333473833728
3.SOTA开发者文档注:“目标版本”为MCU将要升级的版本号,在下载完数据后,与后面MCU上传的版本号核对,若相同则升级成功,不相同则继续升级流程。图6 添加软件版本入口 图7 添加软件版本操作 ? STEP 6 添加升级包在“软件管理”页面点击“添加升级包”,进入配置页面,类型选择“完整包”,接着上传升级包,填写升级包的MD5码,点击“...https://open.iot.10086.cn/doc/nb-iot/book/ota/sota/sota_m531x_process.html
1.“组织(SP)”应用程序使用“组织(SP)”应用程序来设置您使用的组织和地点。 必须至少定义一个组织和一个地点。 对于每个组织,请指定以上属性: 基本货币 缺省项状态 项和公司集 总分类帐清算帐户 可在记录上使用的组织单元(包括地点)的地址代码 组织和地点 组织和地点是公司的逻辑分部。 这些分部是由不同位置执行的操作类型以及不同位置...https://www.ibm.com/docs/zh/mfsp/7.6.2?topic=overviews-organizations-sp-application
2.SP350标牌机操作流程图文教程线号机标签机标牌机第五步:SP350标牌机下载安装编辑软件以及导入Excel教程 http://www.supvan.com/detail/1038 以上就是硕方标牌机生产厂家关于SP350标牌机操作流程的详细介绍,如果对上述介绍存在疑问,可以来电咨询硕方标牌机生产厂家:18610538843,或者在线咨询客服QQ:1239807100 https://www.supvan.com/html/2016/news_1205/1071.html
3.EmbestIDEembestide开发工具受国外限制这两天参加了一个编写操作系统的项目,因为要做很多底层的东西,而且这个操作系统是嵌入式的,所以开始学习ARM汇编,发现ARM汇编和一般PC平台上的汇编有很多不同,但主要还是关键字和伪码上的,其编程思想还是相同的。现将一些学习感悟部分列出来,希望能给有问题的人一点帮助。 https://blog.51cto.com/u_16213585/10928177
4.最新版中文SP贴图绘制软件SubstancePainter2020v6.2.0.513...最新版中文SP贴图绘制软件 Substance Painter 2020 v6.2.0.513 Win破解版中文支持多象限uv 在Substance Painter中跨UV瓷砖(UDIM)进行绘制 全新的VFX艺术家工作流程,并为所有人进行优化! 就是这个。您一直在等待的那一刻。今天,Substance Painter达到了定义,优化和可操作性的新高度。得益于期待已久的新工作流程的引入...https://www.vfxcool.com/24778.html
5.Petrel软件实例操作流程1、 Petrel软件实例操作流程目 录 TOC o 1-2 h z u HYPERLINK l _Toc128989991 第一章 Petrel简介 PAGEREF _Toc128989991 h 1 HYPERLINK l _Toc128989992 一、安装并启动Petrel PAGEREF _Toc128989992 h 1 HYPERLINK l _Toc128989993 二、界面介绍 PAGEREF _Toc128989993 h 2 HYPERLINK l _Toc128989994 第...https://m.renrendoc.com/paper/216477946.html
6.Maya课时:SP基本流程视频教程翼狐网致力于推动CG艺术发展,为用户提供海量的CG视频教程,本节内容主要介绍写实动态自然场景案例制作流程教学【水流模拟丨动态花草】之课时18:SP基本流程.https://www.yiihuu.com/v_241227.html
7.欢迎访问太仓正和国际集装箱码头有限公司网站!三、沪太通的基本操作流程 III. Shanghai-Taicang Customs Clearance Integration Basic Operation Procedure 1、客户或代理向母船公司订舱并申请太仓用箱,母船公司代理根据订舱信息向洋山海关申报预配舱单,与目前传输方式一致。 1. The customer or the shipping agent books space from the ship-owning company, and ...http://www.3tcport.com/Home/CompanySanj
8.单据审核软件通过现代的信息化技术,以及审批工作流理念。把部分工作采用计算机系统进行协作完成,以此达成高效率审批、各级审批流转快、节省大量人力、打印纸张、通讯费用等目的。 二、操作流程 用户可以点击首页【待审核单据】模块,进入相关列表页面,系统会根据单据类型予以划分类别,并通过红标记录单据数量。 https://www.jinshipm.com/appzxsp
9.基于Solidworks三维排版软件NESTINGWorks的使用操作流程解析b) 要选择嵌套的所有零件,请在“零件”旁边的复选框中打勾.(此操作可确保选择所有列出的程序集组件...https://www.swbbsc.com/thread-310483-1-1.html
10.EXADATA软件升级初体验更多本次以一套X7-2 3+2 exadata为例,介绍如何将exadata软件版本从18.1.13.0.0升级至19.2.11.0.0,主要介绍下升级过程。升级过程包括:存储节点的image升级,计算节点的image升级,infiniband交换机。 二、升级的操作流程 第一步,滚动方式升级exadata的3个存储节点的cell image到19.2.11。 https://dbaplus.cn/news-160-3193-1.html
11.糖护士SPUG怎么用?一篇文章全攻略!八步掌握SPUG操作全流程 SPUG操作简单便捷,一共只需八步,测试结果等待时间不超过半分钟,是您控制血糖、尿酸的好帮手,让我们来看看一次操作是怎样完成的: 第一步,SPUG插入手机,点击“糖护士”APP 将SPUG插入手机Type-C接口,正常连接状态下SPUG中间蓝色指示灯会保持常亮,并会跳出提示,选择“默认情况下用于该USB设...https://www.dnurse.com/v2/article/detail/25044
12.关于进一步推进网上自助报账系统运行及相关操作流程的通知网上自助报销系统是集网上电子签批、电子影像、财务网上审核、无现金报销等功能为一体的报销软件,可节省手工签批、填制纸质单据以及排队报销的时间。该系统有别于传统的面对面柜台报销,要求所有的业务信息在网上进行填报,结算通过无现金支付。报账人员在网上按要求完成业务填报,并及时将通过审批流程的纸质报账资料整理后提...https://www.bbc.edu.cn/cwc/2021/0420/c1163a75119/page.htm