【Android源码 栏目提醒】:网学会员Android源码 为您提供Android图形系统的分析与移植 - 图形图像参考,解决您在Android图形系统的分析与移植 - 图形图像学习中工作中的难题,参考学习。
研究与开发 Android图形系统的分析与移植宰 叶炳发。
孟小华 (暨南大学计算机系广州510632)1引言 2 Android图形显示原理 Android作为第一个完整、开放、免费的手机平台,自推 2.1 图形系统组成出以来就是业界的热门话题.由于拥有良好的可移植性和 Android SDK的图形包主要包括
android.graphics、强大的功能.在嵌入式设备方面的应用表现出良好的势
android.view、
android.widget和
android.opengl,前3个是用头。
在图形显示方面,Android建立在Linux上,但并没有 于2D的图形开发。
基于SGL(Skia graphics library)。
像一些桌面Linux使用GTK(GIMP Toolkit)组建XWindows
android.opengl是用于3D的图形开发,基于OpenGL/ES。
(一个多平台的图形用户接口)。
也没有使用Cairo向量图 Skia是一个开放
源码的2D向量图形处理函数库,形链接库实现图形显示,而是使用了专为Android而改良 包含字型、坐标转换以及点阵图,有着高效能且简洁的的一种2D向量图形处理函数库Skia。
在3D图形方面是 表现.在Android平台中搭配OpenGL/ES与特定的硬件基于嵌入式3D图形算法标准OpenGL/ES实现的。
该库可 特征强化了显示效果。
OpenGL/ES是OpenGL的一个以使用硬件加速。
然而。
虽然Coog〕e开放了Android的源 子集.是一个跨平台图形库。
是专门为嵌入式系统而代码。
但相关技术文档很少.而且图形系统的实现原理比 设计的。
较复杂.所以本文集中对Android图形系统的底层原理进 Android图形系统的组成如图1所示。
上层应用调用行研究。
2D和3D图形库对Surface Manager提供的Surface进行绘 制.通过Surface Manager的合成器SurfaceFlinger对各个 Surface进行合成。
并由EGL接口实现在Framebuffer设备·广东省科技计划项目(No.20078020715001) 上的显示。
万方数据 研究与开发 式进行递交。
Application 2.3 Surface Manager的实现 View/Widget/Canvas OpenGL/ES 从Surface Manager工作原理分析.可以理解 SGL Application与Surface Manager是以C,S的模式进行交互 Surface Surface 的,Application处理Surface的部分是客户端,而Surface Manager EGL Manager提供服务.它们之间通过Android的IPC机制 Binder来协助完成.如图3所示。
Frame BUffer 图1 Android图形系统的组成 ISurfaceComposer I 2.2 Surface Manager的工作原理 t t l BnSurfaceComposer}. ;- --1 BpSurfaceComposer I 在Android的图形系统中.Surface Manager是一个重‘ + 要组成,Surface Manager对上层提供Surface给应用进行绘 I SurfaceFhnger ISurface ● + 制,管理对显示子系统的访问。
对来自多个应用的2D和 .BnSurface l· H BpSurface l 3D图像进行无缝的合成后传给底层的EGL进行处理. + Surface I ISurfaceFlingerClient I BClient Surface Manager的工作原理如图2所示。
● JL JL SurfaceBuf艳r r 1 BpSurfaceFIIngerClient卜一 -÷·.1 A一”}:::::。
S—urfkac。
e}::: BnSurfaceFlingerCllent l Surface Frame i….;堕?M?啤!…..j i……全掣!!唑……j L............o......J L一一一一一一一一一一一一.一一.....J ——● Flinger BufIb 图3处理Surface的进程通信 在Binder中,主要包括两个方面:本地(native),如 l蛳H s妇e卜+ BnSurfaceFlingerClient,这是一个需要被继承和实现的类: 图2 Surface Manager的丁作原理 代理(proxy),如BpSurfaceFlingerClient,这是一个在接口框 架中被实现,但是在接口中没有体现的类。
在客户端中。
Surface Manager为Application准备一个或多个Surface BpSurfaceFlingerClient被调用.通过与BnSurfaceFlinger- 后,把Surface传给Application,让Application可以在上面 Client通信.而BpSurfaceFlingerClient和BnSurfaceFlinger- 作图形处理。
应用程序先通过调用图形库提供基础的绘制 Client派生自ISurfaceFlingerClient。
BClient派生自BnSurface. 图形原语和JNI函数.然后又通过Native Method的绘制图 FlingerClient。
形原语调用2D和3D的图形库对Surface进行绘制。
在客户端中通过类SurfaceComposerClient,调用 在Android平台下。
每个Surface都有一个Front Buffer BnSurfaceComposer和BnSurface来响应服务端RpSudace- 和一个Back Buffer。
每个窗13都以一个Surface对象作为 Composer和BpSurface,并通过调用BpSurfaceFlingerClient 基础。
每个Surface又对应一个Layer,SurfaceFlinger将各个 来调用服务端的BnSurfaceFlingerClient,由此完成了客户端 Layer的Front Buffer合成后绘制到Frame Buffer上。
和服务端的交互。
在交互中的3个接口分别介绍如下。
关于SurfaceFlinger,在Surface Manager中用于管理逻 ISurfaceFlingerClient:派生出BpSurfaceFlingerClient 辑上众多的Surface。
其功能特点如下: 和BnSurfaceFlingerClient。
由BClient实现。
通过调用 ·SurfaceFlinger在一个系统范围内合成Surface的功 createSurface函数创建一个Surface供Appheafion应用。
能,并把合成后的显示内容传给帧缓冲设备: ISurface:派生出BpSurface和BnSurface。
主要完成对 ·SurfaceFlinger能一起合成来自多个程序的2D或 Surface的处理,在Surface(派生自BnSurface)的函数lock、 3D显示的Surface: unlockAndPost等。
实现了Surface在双缓冲的处理. ·Surface通过Android的IPC机制Binder以缓冲的形 SurfaceBuffer(生自Surface)实现了Layer上的处理。
三鼍酝 万方数据 璺堡塑堂箜!垒整整兰蠖 IS urfaceComposer:派生出BpSurfaeeComposer和 ·把准备显示的图形提交到Canvas上:BnSurfaceComposer,SurfaceF〔inger(派生自BnSurface ·lockCanvas。
锁定Canvas;Composer)主要为合成器SurfaceFlinger(Surface Manager ·drawCanvas.把bitmap中的数据写入到Back的组成部分)对Surface合成的相关处理提供实现 Buffer中:方法。
·unlockCanvasAndPost,解锁Canvas,Back Buffer替换 Front Buffer。
替换后Back Buffer作为前台缓冲,3 Android的双缓冲技术 Front Buffer作为后台缓冲。
在Android平台中,双缓冲技术分别在Surface的处理 4底层接口与驱动移植和底层Framebuffer的处理中使用到。
在对Framebuffer处理的双缓冲技术根据OpenGL的标准实现,而对Surface处 4.1 Android中的EGL接口理的双缓冲技术则有所不同。
下面将对两种双缓冲技术进 OpenGL/ES为附加功能和可能的平台特性开发了扩行比较。
展机制.但仍然需要一个可以让OpenGL/ES和本地视窗系3.1 OpenGL中的双缓冲技术 统交互且平台无关的层。
EGL是OpenGL/ES和底层Native 在OpenGL中利用双缓冲技术。
分配两个帧缓冲区, 平台视窗系统之间的接13。
是为OpenGL/ES提供平台独立在连续显示三维曲面时,一个帧缓冲区中的数据执行绘制 性而设计。
OpenGL/ES本质上是一个图形渲染管线的状态曲面命令的同时.另一个帧缓冲区中的数据进行图形显 机,而EGL则是用于监控这些状态以及维护Frame Buffer示。
当前可见视频缓冲称为前台视频缓冲,不可见的、正在 和其他渲染Surface的外部层。
绘图的视频缓冲称为后台视频缓冲。
当后台视频帧缓冲中 在Android的底层源代码中,e止native_window_t是一个的数据要求显示时。
OpenGL就将它拷贝到前台视频帧缓 提供了对本地窗口的所有定义以及用于EGL操作本地窗口的所冲.显示硬件不断地读可见视频缓冲中的内容。
并把结果 有方法的类。
EGLNativeSurface派生自egl_native_window_t,显示在屏幕上。
应用双缓冲,每一帧三维曲面只在绘制完 EGLDisplaySurface派生自EGLNativeSurface。
EGLDisplay-成后才显示出来.所以观察者可以看到每一帧完整三维曲 Surface通过函数mapFrameBuffer打开Framebuffer设备,面.而不是曲面的绘制过程。
并创建两个缓冲区.函数swapBuffer把后台视频缓冲区复3.2 Sur/ace中的双缓冲技术 制到前台视频缓冲区。
DisplayHardware类中初始化了 每个Surface中都带有两个帧缓冲区,分别称为Front EGL,SurfaceFlinger使用了DisplayHardware去和本地窗口Buffer和Back Buffer。
与OpenGL中双缓冲技术有所不同, 打交道。
当绘制Back Buffer后需要显示时。
并没有将Back Buffer中 4.2 Android帧缓冲驱动的移植的数据拷贝到Front Buffer中。
而是直接显示Back Buffer中 Android是基于Linux的.但在Linux的帧缓冲驱动中并的数据到屏幕中,从而最大限度地减少了数据的复制。
没有直接支持双缓冲。
修改驱动包括两个方面:一是划分两 图4是使用Canvas绘制Surface的原理。
具体过程 个缓冲区;二是添加缓冲区的切换功能。
本文是在PXA270如下: 上进行研究的,对应的驱动文件是/drive曲ideo/pxam.C。
·创建一个bitmap与Canvas关联起来; 在Android中.double buffer设计成上下两个buffer的 模式,在函数pxatb_setmode ”var一>yres._virtual=var一> yres”修改为“var一>yres_virtual=var一>yres¥2”。
在检查参 数的函数pxafb_check_var0 qb“var一>yres_virtual=max(var一> yres_virtual,var一>yres)”修改为“var->yres_virtual=max 9f (var->yres_virtual,vat一>yres}21I 0相对应的缓冲长度也要 修改为默认的两边,即在函数pxafb_decode_mode_iI而()中 添加“smenden}=2:”o 图4 C娜∞绘制Surface原理 当一个缓冲区已写好,在切换时就需要调用到pan 三筠荔三薹 万方数据 研究与开发函数,该函数将一个新的yoffset传给lED控制器。
在结 bits_per_pixei/8);构体tb_ops pxafb,ops中添加p硼函数,即插入“. break; 2tb_pan_display pxMb_pan_disphy.”到tb_ops pxa/b_ops中。
在初始化帧缓冲的函数pxaib init ibinfo()CP.将“tbi一> }m.fix.ypanstep=O;”修改为“tbi->tb.fix.ypanstep=l;”,这 5结束语里是说明驱动需要用到p粕函数。
以下是需要添加或修改的函数。
对Android的应用开发来说。
图形开发是其中一个主static int pxatb_pan_display(struct fb._var screeninfo+vat, 要工作.了解Android图形系统的工作原理可以对应用strue〔fb info*info)f 程序性能上的提供有所帮助。
在Android移植到其他嵌 struct pxatb_info‘tbi=fstruct pxatb_info*)imCo;/,下一 入式设备中,Android图形系统的底层驱动移植是其中一个显示的Po的yoffset .
上一篇:
Android系统权限大全
下一篇:
7*30m公路预应力混凝土连续梁桥上部结构设计