android 图形技术,Android 技术专题系列之九 -- 图形系统

display panel. SurfaceFlinger handles to transfers drawn data in canvas to surface

front buffer or backbuffer

Except for SurfaceViews, different views within the same ViewRoot

share the same surface.

Layer的概念:

每个surface又对应一个layer, SurfaceFlinger负责将各个layer的front

buffer合成(composite)绘制到屏幕上。

A Layer is something that can be composited by SurfaceFlinger (should

have been called LayerFlinger). There are several types of Layers if

you look in the code, in particular the regular ones (Layer.cpp) ,

they are backed by a Surface, and the LayerBuffer (very badly chosen

name) which don't have a backing store, but receive one from their

client. .

Note that the GGLSurface type, should have been called GGLBuffer

Multiple layers are just composited to the final buffer in their Z order.

有几个对象与Surface概念紧密相关:

1. Java Surface

(frameworks/base/core/java/android/view/Surface.java)。该对象被应用间接调用(通过SurfaceView,

ViewRoot等), 应用需要创建surface,(并同时创建canvas),

将图形绘制到这个对象上并最终投递到屏幕上。

2. C++ Surface (frameworks/base/libs/ui/Surface.cpp。 这个对象被Java

Surface通过Jni 调用,实现Java Surface 的功能

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的接口以及软件实现。在http://developer.android.com/guide/topics/graphics/opengl.html有详细介绍如何使用android.opengl开发3d

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,

创建两个缓冲区,(一个是on screen front 缓冲区, 另一个back buffer, 可能位于offscreen

framebuffer,也可能位于系统内存)。 函数swapBuffers将back buffer内容拷贝到front

buffer中。

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(Hardware Abstraction Layer)层,copybit

device是其中一个模块。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值