首页 > 作文

手机绘图

更新时间:2023-03-20 08:05:12 阅读: 评论:0

教学经验总结-烟台好玩的属鼠几岁 地方

手机绘图
2023年3月20日发(作者:开酒器)

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 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图