首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 平面设计 > 图形图像 >

Android图形系统

2012-07-23 
【原创】Android图形系统Andriod图形系统采用的是client/server架构,server(即SurfaceFlinger)主要由c++编写

【原创】Android图形系统
Andriod图形系统采用的是client/server架构,server(即SurfaceFlinger)主要由c++编写,client端又分为两部分,一部分是由Java编写的应用程序接口,其中调用了一些native代码,就是由另一部分的c++来实现的,实现方式是jni调用。
代码路径:
framework/base/services/surfaceflinger/SurfaceFlinger.cpp
framework/base/core/java/android/view/Surface.java
framework/base/core/jni/android_view_Surface.cpp
frameworks/base/libs/ui/SurfaceComposerClient.cpp


每个view(每个viewgroup共享一个surface)都需要在一个surface上绘制,而surface又通过canvas(每个canvas对象对应一个bitmap)来控制view,就是控制在view上面来画图,每个surface又对应一个layer, 而最终每个surface又是链接到surfaceflinger这个server的,SurfaceFlinger负责将各个layer的front buffer合成(composite)绘制 到屏幕上,具体的底层工作由surfaceflinger这个服务来做,surfaceflinger做了一些3d的转换,以及显示,渲染等事情。
对于Framebuffer的访问:
直接 FrameBuffer 的访问方式,并对 FrameBuffer 采用双缓存技术
没有采用X-Server等方案,直接操作framebuffer,可以减少X-Server带来的通信开销。打开framebuffer, 创建两个缓冲区,(一个是on screen front buffer, 另一个back buffer, 可能位于offscreen framebuffer,也可能位于系统内存)。 源代码中函数swapBuffers将back buffer内容拷贝到front buffer中。双缓存技术使得可以在back buffer中进行绘制,随后拷贝到front buffer中进行合成并显示。
Android 创建一个 Surface 的过程:



与图形相关的代码:
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
提供基本的图形原语(如画点画线,设置图形上下文等),事件机制,以及开发 图形用户界面 的控件 等。
canvas 用于开发2D图形, Surface 代表一个可供图形系统绘制的surface。可在其上绘制2D活3D图形。
opengl,3d库,参考http://developer.android.com/guide/topics/graphics/opengl.html
skia和cairo功能相当,封装底 层的图形硬件 ,为上面的图形库提供最基础的操作图形硬件的原语。
参考《淺談 Google Skia 圖形處理引擎》2和 《Android 的图形引擎 Skia》3

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中。

hardware/libhardware实现了HAL(Hardware Abstraction Layer)层,copybit device是其中一个模块

参考http://blog.csdn.net/dafeifly/article/details/4679853
http://blog.csdn.net/shenbin1430/article/details/4344897

热点排行