Android Surface系统的实现

合集下载

10_Android的GUI系统

10_Android的GUI系统

2.2 libui
format 部分: 这个部分本身定义颜色空间的枚举和数据结构,它需要充 用 pixelflinger 中的一些关于数据格式定义。 EglWindows 部分: 包含了 EGL 头文件构建的 egl_native_window_t ,是整个 系统显示的基础。 Key/Event 部分: 这是 Android 系统输入的基础,其中定义按键的映射,通 过操作 event 事件设备来实现获取系统的输入的。
Android 的 GUI 系统
韩 超 @ Android 技术
Android 的 GUI 系统

第一部分 第二部分 第三部分 第四部分 第五部分 第六部分
Android GUI 系统综述 GUI 框架 libui 库及相关 Surface 系统 2D 图形系统 3D 图形系统 窗口和视图结构
3.1 Surface 系统结构
Surface 系统的结构: libui.so (或 libsurfacefilnger_client.so )提供 Surface 部分的本地接口。 libsurfacefilnger.so 提供实现。 Java 框架主要调用 Surface 向 UI 提供接口。 Navtive 部分主要使用 ISurface 。
2.2 libui
Surface : Surface 相关的头文件和实现为 SurfaceFlinger 定义接口和框架。 头文件: include/surface/ Overlay : 定义视频输出的接口。 Camera : 定义摄像头的框架和接口。 头文件: include/camera/
第三部分 Surface 系统 3.1 Surface 系统的结构 3.2 SurfaceFlinger 本地代码 3.3 Surface 的 Java 和 Jni 代码

surfacetexture例子

surfacetexture例子

surfacetexture例子1.介绍S u rf ac eT ex tu re是A nd ro id平台上用于处理视频纹理的一个类。

它提供了一种将视频帧作为Op en GL纹理进行处理的方式,使开发者可以在不进行像素复制的情况下对视频进行实时处理。

2. Su rfaceTextur e的基本用法2.1创建S u r f a c e T e x t u r e对象要使用Su rf ac eT ext u re,首先需要创建一个Su rf ac eT ext u re对象。

我们可以使用以下代码来创建一个Su rf ac e Te xt ur e对象:```j av aS u rf ac eT ex tu re sur f ac eT ex tu re=n ewS u rf ac eT ex tu re(0);```这里的参数0表示使用默认的纹理I D。

如果要使用自定义的纹理I D,可以将相应的纹理ID传递给Su rf ac eT ex t ur e的构造函数。

2.2将S u r f a c e T e xt u r e绑定到O p e n GL纹理创建好S ur fa ce Te xt u re对象后,我们需要将其绑定到一个O pe nG L纹理上,以便能够对视频帧进行处理。

可以使用以下代码将S u rf ac eT ex tu re绑定到一个Op en GL纹理:```j av ai n tt ex tu re Id=...;//自定义纹理IDs u rf ac eT ex tu re.at t ac hT oG LC on te xt(t ex tu re Id);```2.3更新视频帧一旦将S ur fa ce Te xt u re对象绑定到了一个Op en GL纹理上,就可以通过Su rf ac eT ex tur e的u pd at eT ex Ima g e()方法来更新视频帧。

可以使用以下代码来更新视频帧:```j av as u rf ac eT ex tu re.up d at eT ex Im ag e();```更新视频帧后,可以通过Op en GL的纹理函数对纹理进行进一步的处理,例如进行滤镜效果、混合等。

Android之SurfaceView详解

Android之SurfaceView详解

Android之SurfaceView详解展开全文SurfaceView介绍通常情况程序的View和用户响应都是在同一个线程中处理的,这也是为什么处理长时间事件(例如访问网络)需要放到另外的线程中去(防止阻塞当前UI线程的操作和绘制)。

但是在其他线程中却不能修改UI元素,例如用后台线程更新自定义View(调用View的在自定义View中的onDraw函数)是不允许的。

如果需要在另外的线程绘制界面、需要迅速的更新界面或则渲染UI界面需要较长的时间,这种情况就要使用SurfaceView了。

SurfaceView中包含一个Surface对象,而Surface是可以在后台线程中绘制的。

Surface属于 OPhone底层显示系统。

SurfaceView 的性质决定了其比较适合一些场景:需要界面迅速更新、对帧率要求较高的情况。

使用SurfaceView需要注意以下几点情况:SurfaceView和SurfaceHolder.Callback函数都从当前SurfaceView 窗口线程中调用(一般而言就是程序的主线程)。

有关资源状态要注意和绘制线程之间的同步。

在绘制线程中必须先合法的获取Surface 才能开始绘制内容,在SurfaceHolder.Callback.surfaceCreated() 和SurfaceHolder.Callback.surfaceDestroyed()之间的状态为合法的,另外在Surface类型为SURFACE_TYPE_PUSH_BUFFERS时候是不合法的。

额外的绘制线程会消耗系统的资源,在使用SurfaceView的时候要注意这点。

使用SurfaceView 只要继承SurfaceView类并实现SurfaceHolder.Callback接口就可以实现一个自定义的SurfaceView 了,SurfaceHolder.Callback在底层的Surface状态发生变化的时候通知View,SurfaceHolder.Callback具有如下的接口:surfaceCreated(SurfaceHolder holder):当Surface第一次创建后会立即调用该函数。

Android_图形系统分析-surfaceFlinger流程

Android_图形系统分析-surfaceFlinger流程
numFds= sNumFds=1; numInts= sNumInts=8; 这个是 Parcel 中描述句柄的抽象模式。实际上是指的 Native_handle 所指向句柄对象的具体 内容: numFds=1 表示有一个文件句柄:fd/ numInts= 8 表示后面跟了 8 个 INT 型的数据:
从最上层到最底层的数据流的分析可以看到实际上 GDI 在上层为 GUI 提供一个抽象的 概念,就好像操作系统中的文件系统所提供文件,目录等抽象概念一 样,GDI 输出抽象成了 文本,画笔,位图操作等设备无关的操作,让应用程序员只需要面对逻辑的设备上下文进行输 出操作,而不要涉及到具体输出设备,以及输 出边界的管理。GDI 负责将文本、线条、位图等 概念对象映射到具体的物理设备,所以 GDI 的在大体方向上可以分为以下几大要素:
1.1 点的格式 对于不同的 LCD 来讲,FrameBuffer 的二进制格式不一样,并且可以分为两部分: 1)点的格式:通常将 Depth,即表示多少位表示一个点。
1 位表示一个点 2 位表示一个点 16 位表示一个点 32 位表示一个点(Alpha 通道) 2) 点内格式:RGB 分量分布表示。 例如对于我们常见的 16 位表示一个点
1.2 格式之间的转换 所以屏幕输出实际上是一个值映射的关系。我们可以有如下的点格式转换,
源格式可能来自单色位图和彩色位图,对于具体的目标机来讲,我们的目标格式可能就 是一种,例如 16 位(5/6/5)格式。其实就只存在一种格式的转换,即从目标格式都是 16 位格式。
但是,在设计 GDI 时,基本要求有一个可移植性好,所以我们还是必须考虑对于不同 点格式 LCD 之间的转换操作。所以在 GDI 的驱动程序中涉及到区域操作(Blit):我们在显示 缓冲区上做的最多的操作就是区块搬运。由此,很多的应用处理器使用了硬件图形加速器来 完成区域搬运:blit.从我们的主要操作的对象来看,可以分为两个方向:

Android:毛玻璃效果,快回来!

Android:毛玻璃效果,快回来!

Android:毛玻璃效果,快回来!如今,有很多系统都应用了毛玻璃效果,这样的模糊效果着实令很多开发者和用户深受喜爱,也觉得这种装饰极其具有个性。

在Android系统中也支持这种效果,它是由FLAG_BLUR_BEHIND(这是给开发者看的,安卓用户只需了解)这个常数起的作用。

FLAG_BLUR_BEHIND确实是Android系统中支持的一种窗口标志,它支持的是模糊效果(要将Activity的style设为translucent才有效果),就像上面图片所显示的那样。

美中不足的是经模糊处理后的图像有黑边,也有点褪色,但抛开这些缺点不谈,模糊效果在如今的应用开发中还是颇受欢迎的。

然而,有些开发者们发现,将FLAG_BLUR_BEHIND这个常数用在Android4.0版本以上时却丝毫没有效果。

用在透明的activity上啥用没有,原来是黑色背景的用后还是黑的,根本没有一点变化。

这是为什么呢?我前几天在开发APP时也想用到这个常数,就是想让应用界面更好看一点,但我发现在Android4.0以下的系统中能正常运行,但4.0版本之后的就不行。

这让我很是伤脑筋。

于是我决定翻翻Android 官方文档看看是什么原因,只见它这样写道:意思就是说这个常数早在Android4.0开始就已经废弃了,模糊效果也就不再支持了。

官方说是这么说,难道不应该给出一个具体的原因么?就凭这几行字,怎么可能让开发者知道常数被弃用的原因呢?谷歌官方这样做是好事么?只是弱弱的说几句,到底是什么原因造成不支持,我们要刨根问底,自己慢慢探寻其中的原因了。

我以前在开发应用时也曾用过这个常数,但只要用了这个,我发现下拉状态栏时很不流畅,并且占用系统资源较大,将其弃用也是理所当然。

我在网上也找了一些该常数被弃用的原因,目前为止,我发现的一种说法是:“Android 早期版本确实有支持FLAG_BLUR_BEHIND ,但由于它不是用OpenGL ES 实时绘制,并且性能比较差,所以就在以后的版本废弃这个功能。

SurfaceView类的使用

SurfaceView类的使用

例子:
public class BBatt extends SurfaceView implements SurfaceHolder.Callback, OnKeyListener { private BFairy bFairy; private DrawThread drawThread; public BBatt(Context context) { super(context); this.setLayoutParams(new youtParams (Global.battlefieldWidth,Global.battlefieldHeight)); this.getHolder().addCallback( this ); this.setFocusable( true ); this.setOnKeyListener( this ); bFairy = new BFairy(this.getContext()); } public void surfaceChanged(SurfaceHolder holder, int format,int width,int height) { drawThread = new DrawThread(holder); drawThread.start(); } public void surfaceDestroyed(SurfaceHolder holder) { if( drawThread != null ) { drawThread.doStop(); while (true) try { drawThread.join(); break ; } catch(Exception ex) {} }
}
public void drawMyShape(PointPostion ps) {

onsurfacetexturedestroyed return -回复

onsurfacetexturedestroyed return -回复

onsurfacetexturedestroyed return -回复"onsurfacetexturedestroyed return" 是什么?"onsurfacetexturedestroyed return" 是一个常见的技术术语,通常在Android 开发中见到。

它是一个回调函数,当一个SurfaceTexture 对象被销毁时触发。

这个回调函数可以在TextureView.SurfaceTextureListener 接口中实现,以便在SurfaceTexture 销毁时执行一些特定的操作。

在Android 开发中,SurfaceTexture 是一个用于在图形中显示图像的工具。

开发人员可以创建一个TextureView,然后使用SurfaceTexture 将图像渲染到该view 上。

然而,当这个TextureView 不再使用时,为了释放系统资源,需要销毁对应的SurfaceTexture。

这时,就会触发"onsurfacetexturedestroyed return" 方法。

下面我将一步一步回答您的问题,以便更好地理解"onsurfacetexturedestroyed return"。

第一步:了解SurfaceTextureSurfaceTexture 是一个用于将图像渲染到TextureView 的类。

它可以管理图像的缓冲区,并提供一些用于操作图像的方法。

通过SurfaceTexture,开发人员可以实现图像的显示、旋转、裁剪等操作。

第二步:创建TextureView在Android 开发中,我们可以使用TextureView 控件创建一个可用于显示图像的视图。

通过调用TextureView 的构造函数和setSurfaceTextureListener 方法,我们可以创建一个SurfaceTexture,并在SurfaceTexture 销毁时触发"onsurfacetexturedestroyed return" 方法。

AndroidWMS窗口管理(二)

AndroidWMS窗口管理(二)
void finishDrawingWindow(Session session, IWindow client) { try { synchronized (mWindowMap) { WindowState win = windowForClientLocked(session, client, false); if (win != null && win.mWinAnimator.finishDrawingLocked()) { win.setDisplayLayoutNeeded(); mWindowPlacerLocked.requestTraversal(); } } }
...................... mSurfaceController = new WindowSurfaceController(mSession.mSurfaceSession,
attrs.getTitle().toString(),width, height, format, flags, this, windowType, ownerUid); mSurfaceFormat = format; w.setHasSurface(true); } .................................. mService.openSurfaceTransaction(); try { mSurfaceController.setPositionInTransaction(mTmpSize.left, mTmpSize.top, false); mSurfaceController.setLayerStackInTransaction(getLayerStack()); mSurfaceController.setLayer(mAnimLayer); } finally { mService.closeSurfaceTransaction(); } mLastHidden = true; return mSurfaceController; }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Android Surface系统的实现
梁铁
杭州海康威视数字技术股份有限公司浙江省杭州市310052
摘要:
安卓的图形显示系统负责应用用户界面窗口的绘制,它是安卓系统中一个重要且复杂的模块。

窗口管理服务和图形混合服务是图形显示系统的核心服务,通过分析二者的工作流程对了解安卓图形显示系统起到很大的帮助。

关键词:
安卓系统、图形显示系统、图形混合系统、窗口管理服务
Android Surface Realization
Liangtie
Hikvision Digital Technology Co., Ltd
Hangzhou,Zhejiang Province,310052
Abstract:
Android surface system is responsible for drawing the User Interface Window of android application, it’s a very complicate and important module in the android system. WindowManagerService and SurfaceFlinger service are the key services in the Android Surface System. To analyze these services work flow is very important to understand the android surface system.
Keywords:
Android、Surface、SurfaceFlinger、WindowManagerService
作者简介:梁铁、1980、男、工程师/工学硕士、主要研究方向:嵌入式系统视频编解码实现。

正文:
Android图形显示
Android应用通常由一个或多个基本组件组成,Activity是负责应用与用户交互的组件,内部包括Window窗口。

图1是Android应用和Surface系统交互的流程框图,通过一系列的操作步骤,对Activity和WMS、SurfaceFlinger之间的关系进行初步的展示
1)系统启动一个新的Activity。

2)WMS为Activity创建一个Phone Window类型的窗口, 并注册到WMS。

3)SurfaceFlinger为Surface分配资源,通过共享内存的方式,与应用共同操作
Surface数据缓冲区。

4)应用在Surface上绘制UI窗口的全部视图。

5)SurfaceFlinger把全部应用的Surface图形数据混合起来进行显示输出。

通过对一个Android应用
Activity图形显示流程的分析,对掌握Surface架构
的运行机制,有很大的帮助。

图1 Surface流程示意图
作者简介:梁铁、1980、男、工程师/工学硕士、主要研究方向:嵌入式系统视频编解码实现。

WindowManagerService (WMS)
WMS是由System_Server进程启动的,负责应用程序窗口的创建、控制和管理等工作,并完成系统消息的收集和分发工作。

如图2所示。

应用请求创建窗口时,和应用直接交互的是WindowManagerImpl对象,它会创建一个ViewRoot类负责与WMS的交互。

IWindowSession和IWindow是标准的aidl接口,用于ViewRoot和WMS之间的交互。

其中,IWindowSession接口用于ViewRoot与WMS内部类Session进行跨进程通信。

IWindow接口用于WMS调用ViewRoot内部的W 类,完成派发按键消息等功能。

WMS会创建一个SurfaceComposerClient对象与窗口对应,它是与SurfaceFlinger 服务进行交互的接口。

图2. Activity与WMS交互示意图
SurfaceFlinger
SurfaceFlinger也是由System_Server进程启动系统服务进程,它负责分配和管理Surface图形显示系统需要的资源,并完成SurfaceCompose图形混合的工作用于显示。

如图3所示,SurfaceFlinger服务创建Layer对象对应Activity的Surface,并作者简介:梁铁、1980、男、工程师/工学硕士、主要研究方向:嵌入式系统视频编解码实现。

按照Z轴顺序进行管理。

SurfaceFlinger通过调用Android定义的显示设备HAL层DisplayHardware,为Layer分配GraphicBuffer显示缓冲区。

一般为一个Layer分配两个GraphicBuffer,方便进行PageFlipping显示操作(FrontBuf用于输出,BackBuf 用于绘制)。

SurfaceFlinger服务为每个SurfaceComposerClient创建Client类对象。

Client对象里面包括一个创建在共享缓冲区上的SharedClient对象。

Activity和SurfaceFlinger通过这个对象实现对GraphicsBuffer的访问同步。

SharedClient有31个SharedBufStack对用来管理GraphicBuffer,因此每个Activity 最多可以支持31个Surface图层显示。

图3. SurfaceFlinger显示层管理
Activity Surface视图绘制
应用通过调用以下三步骤,完成UI窗口视图的绘制:
1)LockCanvas,获取并锁定Surface对应的GraphicsBuf中的BackBuffer,与Canvas
绑定,用来存储Surface图形内容。

2)图形绘制。

Canvas类封装了图形绘制函数,通过调用这些功能函数可以完成
视图绘制的工作。

若系统支持GPU硬件加速,则使用GPU完成视图绘制工作,否则ARM完成相关的工作。

作者简介:梁铁、1980、男、工程师/工学硕士、主要研究方向:嵌入式系统视频编解码实现。

3)unlockCanvasAndPost,解除BackBuffer锁定,完成PageFlip(BackBuffer和
FrontBuffer交换), 发送信号给SurfaceFlinger,进行SurfaceCompose工作。

图4. Surface绘制调用过程图
SurfaceFlinger Surface Compose
SurfaceFlinger系统服务进行Surface Compose的工作流程,如图5所示。

1.等待事务处理或等待重绘事件。

2.如果有事务请求,则进行事务处理。

比如窗口90度旋转操作等。

3.各个Layer从GraphicBuffer中的FrontBuffer中获取新数据,并生成一张
OpenGL中的纹理信息。

4.按照Zorder设置顺序,利用OpenGL接口绘制每个LAYER的纹理信息。

5.遍历各个显示层的finishPageFlip函数,释放FrontBuffer。

6.Surface Compose后的图像用来显示。

作者简介:梁铁、1980、男、工程师/工学硕士、主要研究方向:嵌入式系统视频编解码实现。

图5 SurfaceFlinger工作流程图
结语:
在android surface系统中,WindowManagerService服务实现系统对应用activity窗口管理和消息派发等功能,SurfaceFlinger服务实现系统显示资源管理和应用图形统一绘制、输出功能。

参考文献:
[1] 邓凡平.深入理解Android:卷Ι.北京:机械工业出版社,2011.9
[2] 金泰延宋亨周朴知勋等.Android框架解密北京:人民邮电出版社 2012.4
[3] 李刚. 疯狂Android讲义. 北京:电子工业出版社.2011.7
作者简介:梁铁、1980、男、工程师/工学硕士、主要研究方向:嵌入式系统视频编解码实现。

相关文档
最新文档