Introduce My Work 2

早前写了一篇文章“Introduce My Work”,用一个例子 —— HTML5 Canvas的一个简单实现,介绍自己工作的内容,而这篇文章试图去描绘自己工作内容所需的一个完整的知识体系的层次结构(见下图),并对其进行简单介绍。

android_graphics

Browser App

基于系统的GUI框架开发完整的浏览器应用。

Android GUI Framework

  1. 了解Android的View System机制;
  2. 从3.0开始Android支持使用Layer作为View的Backing Store,用于对动画进行加速;
  3. 了解Android Window Surface相关的Java封装和实现细节;
  4. Canvas是Android Java层用于2D绘图的主要对象;

WebKit

WebKit通常可以分为WebCore和WebKit Port,在WebCore中,跟渲染相关的对象主要有RenderLayer, RenderObject, GraphicsContext, Image, ImageBuffer等,而WebKit Port则负责整个渲染架构的设计和实现,它需要考虑:

  1. 使用什么作为Backing Store,是Vector(矢量图),还是Bitmap(位图),还是Texture(贴图),还是Surface(Window Surface);
  2. 支不支持Layer Rendering(分层渲染,需要WebCore开启Accelerated Compositing的支持),支不支持Tile Rendering(分块渲染);
  3. 采用多线程(单进程)的渲染架构还是像WebKit2或者Chrome那样的多进程渲染架构;

Android Graphics Stack (Client)

Android在客户端的绘图堆栈通常包括:

  1. Skia,一个使用CPU进行2D绘图的绘图库;
  2. OpenGL ES,使用GPU进行3D和2D的绘图的API(比如Android 3.0后出现的hwui模块就使用GLES来取代Skia用于2D绘图,实现GPU加速的2D绘图);
  3. EGL,衔接GLES和系统的Native Window系统的适配层;
  4. Surface(Native Window),可以通过Surface接口的一个Stub实现操控远程的Native Window,另外Android 4.0后,应用还可以创建自己的Native Window并且自己负责它的混合;

Android Graphics Stack(Server)

SurfaceFlinger是Android用于管理Display和负责Window Composite(窗口混合),把应用的显示窗口输出到Display的系统服务。

Android Drivers(HAL)

Android的驱动层,通过Android本身的HAL(硬件抽象层)机制,运行于User Space,跟渲染相关的包括:

  1. hwcomposer,如果硬件支持,SurfaceFlinger可以请求hwcomposer去做窗口混合而不需要自己来做,这样的效率也会更高,减少对GPU资源的占用;
  2. gralloc,用来管理Graphics Buffer的分配和管理系统的framebuffer;
  3. copybit,早期Android在GPU不支持完整的GL ES1的情况下,内部的软件版本的GL ES1实现可以使用copybit来加速贴图操作(其实也就是加速窗口混合),hwcomposer出现后就已经移除了;
  4. gles/egl驱动;

Linux Kernel and Drivers

除了标准的Linux内核和驱动(如fb是framebuffer驱动),硬件厂商自己的驱动外,Android自己的一些Patches:

  1. ashmem,异步共享内存,用于在进程间共享一块内存区域,并允许系统在资源紧张时回收不加锁的内存块;
  2. pmem,用于分配物理地址连续的内存块,一般从已经预留的内存区域中分配,主要用来作为Graphics Buffer,不过4.0以后,逐步被更完整的内存管理器ION替代;
  3. binder,高效的进程间通信机制;
  4. sync,用来将呼叫者阻塞,并强制跟显示器的刷新保持同步;

Hardware

CPU,GPU,VPU(Video Process Unit),和内存等等。

 

虽然目前的工作主要集中在WebKit这一层,但是由上至下打通每一个层次,对更好的拓展自己的工作范围,具备挑战更高难度的任务的能力,产出更高品质的成果,的的确确是非常重要的。应该说,自己目前仅仅只是把上面的一个知识体系的架子搭起来,描绘出一个较为完整的轮廓而已,很多部分也仅仅是了解一些简单的概念,特别是底层的层次,无论是其中的原理还是实现的细节了解的非常少。而未来的两到三年的时间,要做的最重要的事情就是不断的拓展,补充和完善上述的知识体系,以期能够早日达成“恢恢乎其于游刃必有余地矣”的境界。

Advertisements