surfaceflinger.docx
- 文档编号:24475974
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:13
- 大小:80.34KB
surfaceflinger.docx
《surfaceflinger.docx》由会员分享,可在线阅读,更多相关《surfaceflinger.docx(13页珍藏版)》请在冰豆网上搜索。
surfaceflinger
Android 技术专题系列之九 -- 图形系统(2009-04-0310:
45:
41)
标签:
adnroid graphics architecture skia opengl it 杂谈
分类:
android
本文试图讲述Android图形系统的底层实现。
Android图形系统底层实现非常复杂,文档较少,没有使用比较流行的图形组建如Xwindow,Cairo等。
Android中的图形系统采用Client/Server架构。
Server(即SurfaceFlinger)主要由c++代码编写而成。
Client端代码分为两部分,一部分是由Java提供的供应用使用的api,另一部分则是由c++写成的底层实现。
下图概要介绍了android图形系统的架构以及使用到的主要组件。
Android图形系统中一个重要的概念和线索是surface。
View及其子类(如TextView,Button)要画在surface上。
每个surface创建一个Canvas对象(但属性时常改变),用来管理view在surface上的绘图操作,如画点画线。
每个canvas对象对应一个bitmap,存储画在surface上的内容。
每个Surface通常对应两个buffer,一个frontbuffer,一个backbuffer。
其中,backbuffer就是canvas绘图时对应的bitmap(研究android_view_Surface.cpp:
:
lockCanvas)。
因此,绘画总是在backbuffer上,需要更新时,则将backbuffer和frontbuffer互换。
ThewindowistiedtoaSurfaceandtheViewRootaskstheSurfacefora
CanvasthatisthenusedbytheViewstodrawonto.AfterViewdrawitsdatatocanvas,ViewRoot
willcallsurface.unlockCanvasAndPost(canvas)toschedulesurfaceFlinger:
:
composeSurfaces()whichdotheactuallydisplayto displaypanel. SurfaceFlingerhandlestotransfersdrawndataincanvastosurfacefrontbufferorbackbuffer
ExceptforSurfaceViews,differentviewswithinthesameViewRootsharethesamesurface.
Layer的概念:
每个surface又对应一个layer,SurfaceFlinger负责将各个layer的frontbuffer合成(composite)绘制到屏幕上。
ALayerissomethingthatcanbecompositedbySurfaceFlinger(shouldhavebeencalledLayerFlinger).ThereareseveraltypesofLayersifyoulookinthecode,inparticulartheregularones(Layer.cpp),theyarebackedbyaSurface,andtheLayerBuffer(verybadlychosenname)whichdon'thaveabackingstore,butreceiveonefromtheirclient..NotethattheGGLSurfacetype,shouldhavebeencalledGGLBuffer
Multiplelayersarejustcompositedtothefinalbufferin theirZorder.
有几个对象与Surface概念紧密相关:
1.JavaSurface(frameworks/base/core/java/android/view/Surface.java)。
该对象被应用间接调用(通过SurfaceView,ViewRoot等),应用需要创建surface,(并同时创建canvas),将图形绘制到这个对象上并最终投递到屏幕上。
2.C++Surface(frameworks/base/libs/ui/Surface.cpp。
这个对象被JavaSurface通过Jni调用,实现JavaSurface的功能
3.ISurface(以及其派生类BnSurface)。
这个对象是应用和server之间的接口。
C++Surface创建这个ISurface(BnSurface)并发送命令,如更新surface内容到屏幕上。
Server端接受这个命令并执行相应操作。
研究一个surface如何创建的关键路径如下:
1.frameworks/base/core/java/android/view/Surface.java--Surface:
:
Surface()
2.frameworks/base/core/jni/android_view_Surface.cpp--Surface_init()。
在这个函数中SurfaceComposerClient对象被创建。
3.frameworks/base/libs/ui/SurfaceComposerClient.cpp--SurfaceComposerClient:
:
SurfaceComposerClient().这个函数非常重要,在这里建立了client和server之间的桥梁。
通过函数_get_surface_manager()获得了一个指向server的IBinder对象(具有ISurfaceComposer接口),之后通过这个IBinder就可以跨进程访问Server的功能。
接着调用ISurfaceComposer:
:
createConnection()创建并返回了一个ISurfaceFlingerClient的IBinder。
4.frameworks/base/libs/ui/SurfaceComposerClient.cpp--SurfaceComposerClient:
:
createSurface().这个函数中,利用前面获得的ISurfaceFlingerClient的IBinder,调用其createSurface接口。
5.frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp--BClient:
:
createSurface()。
BClient由ISurfaceFlingerClient派生而来。
6.frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp--SurfaceFlinger:
:
createSurface()。
这个函数为Surface创建一个对应的Layer。
上述关键路径中,1,2,3,4运行于client进程中,而5,6运行与server进程中。
server作为一个service提供给client访问。
与图形相关的代码主要位于下列目录:
1、frameworks/base/graphics/java/android/graphics
2、frameworks/base/core/java/android/view
3、frameworks/base/core/java/android/widget
4、frameworks/base/opengl/
5、frameworks/base/libs/ui
6、frameworks/base/libs/surfaceflinger
7、frameworks/base/core/jni/android/graphics
8、frameworks/base/core/jni/android/opengl
9、frameworks/base/core/jni/android/android_view_*.cpp
10、external/skia
一、下列目录中的部分代码:
1、frameworks/base/graphics/java/android/graphics
2、frameworks/base/core/java/android/view
3、frameworks/base/core/java/android/widget
android.graphics,android.view和android.widget功能和其他类似的图形库如Qt/Gtk+差不多,分别提供基本的图形原语(如画点画线,设置图形上下文等),事件机制,以及开发图形用户界面的控件等。
canvas用于开发2D图形,Surface代表一个可供图形系统绘制的surface。
可在其上绘制2D活3D图形。
二.frameworks/base/opengl/
这个目录包含opengel的接口以及软件实现。
在graphics。
三.external/skia,台湾的Jserv先生有一篇比较好的介绍,感兴趣的读者可以参考他的博文(http:
//blog.linux.org.tw/~jserv/archives/002095.html)。
简而言之,skia与cairo功能相当,封装底层的图形硬件,为上面的图形库提供最基础的操作图形硬件的原语。
四.frameworks/base/libs/ui和frameworks/base/libs/surfaceflinger
ISurface定义了基础的Surface接口,供图形系统客户端(应用)和server端(即surfaceflinger)交互。
BpSurface是ISurface的派生类,提供接口供server调用客户端功能;
BnSurface是ISurface的另一个派生类,提供接口供客户端调用server功能。
当server收到来自客户端(通过BnSurace)的调用请求后,如registerBuffers,postBuffer等,BnSurface:
:
onTransact被触发。
Surface(LayerBaseClient的私有类)是BnSurface的派生类。
SurfaceBuffer(SurfaceBuffer的私有类)是Surface的派生类。
ISurfaceComposer定义了基础的接口,供客户端和server端交互。
BpSurfaceComposer是一个派生类,提供接口供server调用客户端功能;
BnSurfaceComposer是另一派生类,提供接口供客户端调用server功能。
类SurfaceFlinger由BnSurfaceComposer派生而来。
SurfaceComposerClient直接供客户端使用,调用ISurface(BnSurface)和ISurfaceComposer(BnSurfaceComposer)以及ISurfaceFlingerClient接口,与server交互。
BClient派生自ISurfaceFlingerClient(BnSurfaceFlingerClient),调用server的createSurface,真正创建一个surface。
每个surface对应一个layer.
egl_native_window_t定义了一个本地window类。
这个类提供了对本地window的所有描述以及用于egl(opengl与本地图形系统的接口)操作本地windwo的所有方法。
EGLNativeSurface是egl_native_window_t的一个派生类。
EGLDisplaySurface是EGLNativeSurface的派生类。
EGLDisplaySurface是一个非常重要的类,在这个类里,真正打开framebuffer设备(/dev/graphics/fb0或者/dev/fb0),并将这个设备封装成EGLDisplaySurface的形式供server使用。
函数mapFrameBuffer打开framebuffer,创建两个缓冲区,(一个是onscreenfront缓冲区,另一个backbuffer,可能位于offscreenframebuffer,也可能位于系统内存)。
函数swapBuffers将backbuffer内容拷贝到frontbuffer中。
DisplayHardware类中初始化了egl系统,并为本地窗口对象EGLDisplaySurface创建了对应的EGLSurface对象。
surfaceflinger使用DisplayHardware去和本地窗口打交道。
五、下列目录中的部分代码
7、frameworks/base/core/jni/android/graphics
8、frameworks/base/core/jni/android/opengl
9、frameworks/base/core/jni/android/android_view_*.cpp
这些目录下的代码在Java层的graphics组件和native(c++)组件之间衔接,将java层的功能调用转换到对应的本地调用。
hardware/libhardware实现了HAL(HardwareAbstractionLayer)层,copybitdevice是其中一个模块。
Android图形系统剖析架构
Android中的图形系统采用Client/Server架构。
Server(即SurfaceFlinger)主要由C++代码编写而成。
Client端代码分为两部分,一部分是由Java提供的供应用程序使用的API,令一部分则是用C++写成的底层实现。
下图概要介绍了Android图形系统的架构以及使用的主要组件。
SurfaceFlinger
SurfaceFlinger在整个图形系统中担任server角色,它负责将各个surface根据Zorder合成(composer)起来。
Surface
Android图形系统中一个重要的概念和线索是surface。
View及其子类(如TextView,Button)要画在surface上。
每个surface创建一个Canvas对象(但属性时常改变),用来管理view在surface上的绘图操作,如画点画线。
每个canvas对象对应一个bitmap,存储画在surface上的内容。
每个Surface通常对应两个buffer,一个frontbuffer,一个backbuffer。
其中,backbuffer就是canvas绘图时对应的bitmap(研究android_view_Surface.cpp:
:
lockCanvas)。
因此,绘画总是在backbuffer上,需要更新时,则将backbuffer和frontbuffer互换。
ThewindowistiedtoaSurfaceandtheViewRootaskstheSurfaceforaCanvasthatisthenusedbytheViewstodrawonto.AfterViewdrawitsdatatocanvas,ViewRootwillcallsurface.unlockCanvasAndPost(canvas)toschedulesurfaceFlinger:
:
composeSurfaces()whichdotheactuallydisplaytodisplaypanel.SurfaceFlingerhandlestotransfersdrawndataincanvastosurfacefrontbufferorbackbuffer.
ExceptforSurfaceViews,differentviewswithinthesameViewRootsharethesamesurface.
Layer
每个surface又对应一个layer,SurfaceFlinger负责将各个layer的frontbuffer合成(composite)绘制到屏幕上。
ALayerissomethingthatcanbecompositedbySurfaceFlinger(shouldhavebeencalledLayerFlinger).ThereareseveraltypesofLayersifyoulookinthecode,inparticulartheregularones(Layer.cpp),theyarebackedbyaSurface,andtheLayerBuffer(verybadlychosenname)whichdon'thaveabackingstore,butreceiveonefromtheirclient..NotethattheGGLSurfacetype,shouldhavebeencalledGGLBuffer.
MultiplelayersarejustcompositedtothefinalbufferintheirZorder.
创建一个Surface的过程
Android创建一个Surface的过程如下面的序列图所示:
研究一个surface如何创建的关键路径如下:
1.frameworks/base/core/java/android/view/Surface.java—Surface:
:
Surface()。
2.frameworks/base/core/jni/android_view_Surface.cpp—Surface_init()。
在这个函数中SurfaceComposerClient对象被创建。
3.frameworks/base/libs/ui/SurfaceComposerClient.cpp—SurfaceComposerClient:
:
SurfaceComposerClient().
这个函数非常重要,在这里建立了client和server之间的桥梁。
通过函数_get_surface_manager()获得了一个指向server的IBinder对象(具有ISurfaceComposer接口),之后通过这个IBinder就可以跨进程访问Server的功能。
接着调用ISurfaceComposer:
:
createConnection()创建并返回了一个ISurfaceFlingerClient的IBinder。
4.frameworks/base/libs/ui/SurfaceComposerClient.cpp—SurfaceComposerClient:
:
createSurface().
这个函数中,利用前面获得的ISurfaceFlingerClient的IBinder,调用其createSurface接口。
5.frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp—BClient:
:
createSurface()。
BClient由ISurfaceFlingerClient派生而来。
6.frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp—SurfaceFlinger:
:
createSurface()。
这个函数为Surface创建一个对应的Layer。
上述关键路径中,1,2,3,4运行于client进程中,而5,6运行与server进程中。
server作为一个service提供给client访问。
与图形相关的代码分析
与图形相关的代码主要位于下列目录:
1.frameworks/base/graphics/java/android/graphics
2.frameworks/base/core/java/android/view
3.frameworks/base/core/java/android/widget
4.frameworks/base/opengl/
5.frameworks/base/libs/ui
6.frameworks/base/libs/surfaceflinger
7.frameworks/base/core/jni/android/graphics
8.frameworks/base/core/jni/android/opengl
9.frameworks/base/core/jni/android/android_view_*.cpp
10.external/skia
android.graphics,android.view和android.widget
1.frameworks/base/graphics/java/android/graphics
2.frameworks/base/core/java/android/view
3.frameworks/base/core/java/android/widget
android.graphics,android.view和android.widget功能和其他类似的图形库如Qt/Gtk+差不多,分别提供基本的图形原语(如画点画线,设置图形上下文等),事件机制,以及开发图形用户界面的控件等。
canvas用于开发2D图形,Surface代表一个可供图形系统绘制的surface。
可在其上绘制2D活3D图形。
frameworks/base/opengl/
这个目录包含opengel的接口以及软件实现。
在
有详细介绍如何使用android.opengl开发3dgraphics。
external/skia
skia与cairo功能相当,封装底层的图形硬件,为上面的图形库提供最基础的操作图形硬件的原语。
关于skia可参考《淺談GoogleSkia圖形處理引擎》2和《Android的图形引擎Skia》3两篇文章。
frameworks/base/libs/ui和frameworks/b
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- surfaceflinger