Android图形系统(Graphics)
最近开发遇到问题,ImageView设置visibility未显⽰。这时View已经post到主线程显⽰,并且⽗view可以正常显⽰。怀
疑是系统显⽰问题于是对显⽰系统进⾏了学习梳理。
本⽂将从三教师节慰问信 个⽅⾯介绍Android图形系统。
⼀、图形系统简介
1.1Android绘制基础
1.系统绘制的是什么?
图形缓冲区,也叫Buffer。应⽤层的View树最终会转换成Buffer,置于BufferQueue中被绘制。
2.绘制的位置在哪⾥?
应⽤端会把⼀切内容渲染到surface上,最终显⽰到LCD/OLED显⽰屏
3.如何把图像绘制到屏幕?
绘制任务由应⽤发起,通过跨进程⽅式把Buffer传到FW层,由FW层中的SurfaceFlinger服务调⽤Linux硬件驱动最终绘制到硬件屏幕上。
1.2Android图形引擎
图形系统提供绘图和图形处理⽀持。
Android框架提供了各种⽤于2D和3D图形渲染的API、图⽚解码库,以及各种Driver⽀持。
绘图API:2D引擎Skia,3D引擎OpenGLES,RenderScript,OpenCV和Vulkan。
图⽚解码库:jpg,png,gif等。
应⽤开发者可通过三种⽅式将图像绘制到屏幕:
Canvas:2D图形API,AndroidView树实际的绘制者。
OpenGLES:嵌⼊式设备的OpenGL三维图形API⼦集。
Vulkan:跨平台的2D和3D绘图引擎,Android7.0后⽀持,NDK。
1.3图形系统架构
整个图形系统架构是⼀个⽣产者和消费者模式,五层依次介绍:
treamProducers:
view2020年春 每次执⾏lockCanvas->draw->unlockCanvas,会存⼊⼀帧数据进⼊BufferQueue中
Framework:
Buffer的⽣成和BufferQueue数据跨进程传递
Manager:
计算窗⼝⼤⼩,位置等,同时也会将相应的参数设置给SurfaceFlinger,⽐如Window的z-order和⼤⼩等。
treamconsumers:
SurfaceFlinger,消耗当前可见的Surface,作为Layer的管理着,同是也是BufferQueue的消费者,当每个Layer的⽣产者绘制完⼀帧
时,会通知SurfaceFlinger。
:
Gralloc:图形内存分配器,分配图像⽣产⽅请求的内存
HardwareCompor:硬件混合渲染器,合成SurfaceFlinger⾥⾯的Layer,并显⽰
⼆、图形组件与绘制流程
2.12D/3D绘图流程
2Drenderingpath
2D绘制:Canvasapi/view的⼦类(button,list)/⾃定义view
3Drenderingpath
3D绘制:应⽤直接使⽤OpenGL接⼝绘制图形(PixelFlinger对应的是openGl1.0,GUPdriver对应的是2.0和3.0)
所有情况下的绘图都渲染到⼀个包含GraphicBuffer的Surface上,当⼀块Surface显⽰在屏幕上时,就是⽤户所看到的窗⼝。
2.2Canvas/Skia/hwui/OpenGLES
Canvas:画布,2D图形API,AndroidView树实际的渲染者。
Skia绘制:Android4.0之前默认使⽤,主线程通过CPU完成绘图指令操作,在复杂场景下单帧容易超过16ms导致卡顿。
hwui硬件加速绘制:使⽤GUP绘制,Android4.0及以后默认开启硬件加速渲染。5.0以后把渲染拆分成了两个线程:主线程负责记录渲染指
令,渲染线程负责通过OpenGLES完通魔作坊 成渲染,两个线程并发执⾏。
注意:并⾮所有2D绘制操作都⽀持硬件加速,可能会影响部分⾃定义视图或绘制调⽤。详情见:Android硬件加速
OpenGLES:OpenGL三维图形API的⼦集,针对⼿机、PDA和游戏主机等嵌⼊式设备⽽设计。在异步线程直接
通过OpenGLES进⾏渲染,⼀般适⽤于游戏、视频播放等独⽴场景
2.3图形组件WMS
WindowMa扁平疣吃什么药 nagerService(WMS)窗⼝管理服务,管理系统中所有的窗⼝。
管理window(view的容器)
Window与surface对应,⼀块显⽰区域。添加⼀个window,就是WMS为其分配⼀块Surface的过程。
WindowManager为SurfaceFlinger提供窗⼝元数据(windowmetadata)
AndroidtContentView就是将View设置到widow上。
WMS⾓⾊在整个流程的位置:
这⾥有⼀个wm命令可以看到window的信息:对⼿机分辨率、像素密度、显⽰区域进⾏设置的命令
2.4Surfa2.4Surface与相关的view
Google在Androidsource官⽹提⽰:
“Whateverydevelopershouldknowaboutsurfaces,SurfaceHolder,EGLSurface,SurfaceView,
GLSurfaceView,SurfaceTexture,TextureView,SurfaceFlinger,andVulkan.”
这⾥就对这些控件进⾏简单介绍:
Surface
Surface:Handleontoarawbufferthatisbeingmanagedbythescreencompositor.
Surface中国十大帅哥 对应⼀块屏幕缓冲区。⽣产者是:SurfaceTexture、MediaRecorder等,消费者是:OpenGL、MediaPlayer或CameraDevice
等。每个window对应⼀个Surface。Canvas或OpenGLES等最终都渲染到Surface上。
Flutter在Android平台上也是直接渲染到Surface。例如:⼀个Activity/Dialog都是⼀个Surface,它承载了上层的图形数据,与
SurfaceFlinger侧的Layer相对应。
屏幕上的每⼀帧图像都是多个surface合成后的结果:
Canvasrendering:
Canvas(画布)实现由Skia图形库提供。为了确保两个客户端不会同时更新某个缓冲区,使⽤以下命令处理画布锁:
SurfaceView和SurfaceHolder
SurfaceView
使⽤双缓冲机制,有⾃⼰的surface,View只是⼀个透明的占位符,Surface可以在后台线程中绘制。双缓冲机制提⾼渲染效率,独⽴线程
绘制,提升流畅性。适合⼀些场景:需要界⾯迅速更新、UI绘制时间长、对帧率要求较⾼的情况。
SurfaceHolder
提供访问和控制Surface相关的⽅法。通过SurfaceView的getHolder()函数可以获取SurfaceHolder对象,Surface就在SurfaceHolder对象
内。
addCallback(ckcallback)/CanvaslockCanvas()/unlockCanvasAndPost(Canvascanvas)
TextureViewSurfaceTexture/GLSurfaceView/TextureView
SurfaceTexture:Surface和OpenGLES(GLES)纹理(Texture)的组合。将图像流转为OpenGL外部纹理。
TextureView:持有SurfaceTexture,将图像处理为OpenGL纹理更新到HardwareLayer。
GLSurfaceView:加⼊EGL管理,⾃带GL上下⽂和GL渲染线程
这些View通常涉及到Android⾳视频相关,需要⾼效的渲染能⼒。如下⾯的SurfaceTexture在camera中的应⽤。
GraBufferQueueGraphicBuffer/BufferQueue
GraphicBuffer
简称Buffer,⼀个Buffer包含⼀帧图像,Buffer由gralloc分配和回收。Buffer属性包含:width,height,format,usage等
BufferQueue
BufferQueue的引⼊是为了解决显⽰和性能问题。
Surface属于APP进程,Layer属于系统进程,如果它们之间只⽤⼀个Buffer,会存在显⽰和性能问题。
⼀些Buffer⽤于绘制,⼀些Buffer⽤于显⽰,双⽅处理完之后,交换⼀下Buffer,提⾼效率。
BufferQueue中包含多个Buffer对象。
Android图形系统包含了两对⽣产者和消费者模型,它们都通过BufferQueue进⾏连接:
和OpenGLES⽣产图形数据,SurfaceFlinger消费图形数据。
eFlinger合成所有图层的图形数据,Display显⽰合成结果。
SurfaceFlinger
code:frameworks/native/rvices/surfaceflinger
Surface表⽰APP进程的⼀个窗⼝,承载了窗⼝的图形数据。
SurfaceFlinger是系统进程合成所有窗⼝的系统服务,负责合成所有Surface提供的图形数据,然后送显到屏幕。
SurfaceFlinger既是上层应⽤的消费者,⼜是Display的⽣产者,起到了承上启下的作⽤。
数据流:
合成⽰意图:
SurfaceFlinger的启动流程:
SurfaceFlinger服务由init进程启动,⼀个⾼优先级的本地守护进程。SurfaceFlinger启动流程
Android系统的启动流程:
可以看到SurfaceFlinger的启动是和Zygote进程启动位于同⼀流程中。
SurfaceFlingerAPI
Vsync机制
在介绍Vsync机制之前先介绍两个重要概念:
屏幕刷新率:屏幕每秒钟可以刷新多少次。60HZ刷新率,16.7ms刷新⼀次。(120HZ/8.3ms),硬件指标。
GPU绘制帧率:GPU每秒能够合成绘制多少帧。
软件层触发View绘制的时机是随机的,当下⼀次屏幕刷新时,屏幕从FrameBuffer中拿到的数据还是“帧1”的数据,导致“丢帧”。
每隔16ms硬件层发出vsync信号,应⽤层接收到此信号后会触发UI的渲染流程,同时vsync信号也会触发SurfaceFlinger读取Buffer中
的数据,进⾏合成显⽰到屏幕上。
总结:Vsync机制将CPU和GPU的开始时间与屏幕刷新强⾏拖拽到同⼀起跑线
三、Graphics问题总结
Android提供的Graphics流程相对⽐较复杂对其进⾏具象后的流程如下两张图所⽰:
本文发布于:2023-03-20 08:05:10,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/232dab67a207b4ef178079fd610eb0b1.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:手机绘图.doc
本文 PDF 下载地址:手机绘图.pdf
留言与评论(共有 0 条评论) |