`

【原创】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
  • 大小: 8.3 KB
  • 大小: 16.1 KB
分享到:
评论

相关推荐

    android系统数据库管理工具SQLiteExpertSetup.zip

    Android系统数据库管理工具SQLiteExpertSetup.zip是一个专门为Android开发者设计的实用工具,用于高效地管理和操作Android设备或模拟器上的SQLite数据库。SQLite是一个轻量级、关系型数据库管理系统,广泛应用于移动...

    Android 7.0 全套教程PPT 全部手写 原创

    【Android 7.0 全套教程PPT 全部手写 原创】这一教程集合涵盖了Android开发的基础到高级知识,旨在帮助教师和初学者深入理解Android 7.0系统开发。作为一套原创的手写PPT,它强调了实践操作与理论知识的结合,以直观...

    Android-screensave.zip_Android 屏保_Android屏保_android

    Android允许开发者创建自定义的屏保,这涉及到对Android系统的深度理解和对动画、图形的处理。源代码可能包括: 1. 自定义View类,实现屏保的显示逻辑和动画效果。 2. 使用Canvas和Paint进行绘图,创建独特的视觉...

    Android代码-原创自定义控件之-Canvas实时绘制音乐波形图

    2. **Canvas绘图**:Canvas是Android图形系统的核心组件,用于在Surface上绘制各种形状、文本、图像等。在onDraw()方法中,我们可以调用Canvas的各种API,如drawRect(), drawCircle(), drawBitmap()等,来进行图形...

    android游戏开发原创实例人物移动+子弹+跳高

    总的来说,"android游戏开发原创实例人物移动+子弹+跳高"是一个综合性的项目,涵盖了Android游戏开发的多个核心领域。通过这个实例,开发者不仅可以掌握基本的2D图形编程,还能学习到如何处理用户输入、实现游戏逻辑...

    原创讲解Android Menus

    在Android系统中,Menu主要用于在特定时刻显示一组可执行的操作,比如在活动(Activity)顶部出现的三个点(汉堡菜单)或在对话框中。下面将详细讲解Android Menus的各个方面。 1. **Menu类型**: - **Option Menu...

    [DevDiv原创]Android学习系列教程实例

    根据给定的文件信息,以下是对“[DevDiv原创]Android学习系列教程实例”的关键知识点的详细解析: ### 一、Android系统结构与初始化流程 #### 1.1 Android的发展历史回顾 Android操作系统是由Google公司主导开发...

    android开发资料大全

    Android 图形系统剖析 Android 立体效果图片 NDK动态库的调用 Android 姿态传感器 Android 很酷的图像旋转 Android 添加音频 在Android中实现多线程断点下载 Android提高篇内容整理 android移动开发案例精选 ...

    Android俄罗斯方块(原创)

    3. **图形绘制**:Android提供了Canvas和Paint类用于在屏幕上绘制。俄罗斯方块的每个方块可以用一个自定义View来表示,重写onDraw()方法,在其中用Canvas绘制不同形状的方块。 4. **游戏逻辑**:编写处理方块生成、...

    14天学会Android开发 飞龙整理 20141005

    * Android是一个针对移动设备的操作系统和软件平台 * 基于Linux内核,由Google和开放手机联盟OHA开发 * 允许使用Java语言来开发和管理代码 * Android开放源代码,遵从Apache Software License (ASL)2.0版本的协议 ...

    基于Android的移动应用屏幕锁源码(原创可运行).rar

    通过分析这个基于Android的移动应用屏幕锁源码,我们可以学习到Android开发中的多个重要方面,包括系统权限、UI设计、服务与广播接收器的使用,以及安全策略的实施。这对于提升Android开发技能和理解系统级别的安全...

    android-推箱子游戏源代码

    在Android推箱子游戏中,2.5D视图可能会使用OpenGL ES或其他图形库来实现,使得游戏画面更具有立体感。 游戏的核心算法是推箱子的逻辑处理,包括箱子的移动、推动、以及解谜的判定。这通常涉及到一系列的条件判断和...

    Android毕业设计论文

    1. **Android 系统环境**:Android 是一个开源的移动操作系统,广泛用于智能手机和平板电脑。在Android平台上开发应用,需要熟悉其SDK(软件开发工具包)和编程语言Java或Kotlin。 2. **游戏设计**:解谜游戏的开发...

    基于Android的移动应用图案解锁之九宫解锁源码(原创可运行).rar

    通过分析和学习这个源码,开发者可以深入了解Android系统事件处理、图形绘制、数据存储、用户界面设计以及安全性的实践应用。这对于开发自己的Android应用,尤其是涉及用户验证和安全功能的部分,具有很大的指导价值...

    Android 3D游戏-旋转积木源码

    OpenGL ES是Android系统中用于图形渲染的主要库,特别是在处理3D图形时。 首先,我们要理解3D游戏开发的基础。3D模型是游戏中的基本元素,它们由多边形构成,如三角形或四边形,通过纹理贴图赋予色彩和细节。在这个...

    android开发-2048游戏源代码

    在Android开发领域,2048游戏是一款广受欢迎的轻量级数字拼图游戏,源自意大利开发者Gabriele Cirulli的原创作品。本项目是一个基于Android平台的2048游戏源代码实现,旨在帮助开发者了解游戏开发过程,学习如何在...

    Android.3D游戏开发技术宝典

    3. OpenGL ES:作为Android上专门的图形API,需要了解其工作原理、图形管线、着色器语言GLSL、纹理映射、光照处理等。 4. 3D图形学:理解3D坐标系统、模型矩阵、视图矩阵、投影矩阵、向量和矩阵运算等基础概念。 5...

Global site tag (gtag.js) - Google Analytics