xuchuanyin / workbench

0 stars 0 forks source link

2018-12-18 android graphic classes #82

Open xuchuanyin opened 5 years ago

xuchuanyin commented 5 years ago

1. SurfaceComposerClient
  成员变量mClient指向的实际上是一个类型为BpSurfaceComposerClient的Binder代理对象,而这个类型为BpSurfaceComposerClient的Binder代理对象引用的是一个类型为Client的Binder本地对象.
  成员函数getComposerService用来获得SurfaceFlinger服务的一个代理接口.

2. ISurfaceComposerClient:Client类和BpSurfaceComposerClient类均实现了类型为ISurfaceComposerClient的Binder接口
  成员函数getControlBlock用来获得由SurfaceFlinger服务创建的一块用来传递UI元数据的匿名共享内存;
  成员函数createSurface用来请求SurfaceFlinger服务创建一个Surface.

3. ComposerService

4. LayerBaseClient
  Layer类继承了LayerBaseClient类;LayerBaseClient类继承了LayerBase类;LayerBase类继续了RefBase类。
  Layer类内部的成员变量mUserClientRef指向了一个ClientRef对象,这个ClientRef对象内部有一个成员变量mControlBlock,它指向了一个SharedBufferServer对象。从前面Android应用程序与SurfaceFlinger服务之间的共享UI元数据(SharedClient)的创建过程分析一文可以知道,SharedBufferServer类是用来在SurfaceFlinger服务这一侧描述一个UI元数据缓冲区堆栈的,即在SurfaceFlinger服务中,每一个绘图表面,即一个Layer对象,都关联有一个UI元数据缓冲区堆栈。
  LayerBaseClient类内部有一个类型为LayerBaseClient::Surface的弱指针,它引用了一个Layer::SurfaceLayer对象。这个Layer::SurfaceLayer对象是一个Binder本地对象,它是SurfaceFlinger服务用来与Android应用程序建立通信的,以便可以共同维护一个绘图表面。

5. ISurface 
  Android应用程序就是通过ISurface接口的成员函数requestBuffer来请求SurfaceFlinger服务为它的一个绘图表面分配一个图形缓冲区的,这个图形缓冲区使用一个GraphicBuffer对象来描述。

6. SurfaceControl
  在Android应用程序这一侧,每一个绘图表面都使用一个Surface对象来描述,每一个Surface对象都是由一个SurfaceControl对象来创建的.
  成员变量mClient是一个类型为SurfaceComposerClient的强指针,它指向了Android应用程序进程中的一个SurfaceComposerClient单例对象.
  成员变量mSurface是一个类型为ISurface的强指针,它指向了一个类型为BpSurface的Binder代理对象,而这个Binder代理对象引用的是一个Layer::SurfaceLayer对象。当Android应用程序请求SurfaceFlinger服务创建一个绘图表面的时候,SurfaceFlinger服务就会在内部创建一个Layer::SurfaceLayer对象,并且将这个Layer::SurfaceLayer对象的一个Binder代理对象返回来给Android应用程序,然后Android应用程序再将这个Binder代理对象保存在一个SurfaceControl对象的成员变量mSurface中。
  成员变量mSurfaceData是一个类型为Surface的强指针,它指向了一个Surface对象。Surface类就是用来在Android应用程序这一侧描述绘图表面的,它的成员变量mSurface与它的宿主类SurfaceControl的成员变量mSurface指向的是同一个Binder代理对象,即它们都引用了在SurfaceFlinger服务内部所创建的一个类型为Layer::SurfaceLayer的Binder本地对象。
  成员变量mClient指向了Android应用程序进程中的一个SurfaceClient单例对象。在前面Android应用程序与SurfaceFlinger服务之间的共享UI元数据(SharedClient)的创建过程分析一文中,我们已经介绍过SurfaceClient类的实现了,Android应用程序就是通过它来请求SurfaceFlinger服务创建共享UI元数据的,并且可以通过它来请求SurfaceFlinger服务渲染一个绘图表面
  成员变量mSharedBufferClient指向了一个SharedBufferClient对象。SharedBufferClient类是用来在Android应用程序这一侧描述一个UI元数据缓冲区堆栈的,即在Android应用程序中,每一个绘图表面,即一个Surface对象,都关联有一个UI元数据缓冲区堆栈。
  Surface类继承了EGLNativeBase类,而EGLNativeBase类又继承了ANativeWindow类。我们知道,Android系统是通过OpenGL库来绘制UI的。OpenGL库在绘制UI的时候,需要底层的系统提供一个本地窗口给它,以便它可以将UI绘制在这个本地窗口上。Android系统为OpenGL库定提供的本地窗口使用ANativeWindow类来描述,Surface类通过EGLNativeBase类间接地继承了ANativeWindow类,因此,Surface类也是用来描述OpenGL绘图所需要的一个本地窗口的。从这个角度出发,我们可以将Surface类看作OpenGL库与Android的UI系统之间的一个桥梁。

7. SharedBufferServer、SharedBufferClient、SharedBufferBase
  成员变量mSharedClient指向一块UI元数据缓冲区,即一个SharedClient对象;
  成员变量mSharedStack指向一个UI元数据堆栈,即一个SharedBufferStack对象;
  成员变量mIdentity用来描述一个绘图表面的ID。

8. SharedBufferBase
  成员函数waitForCondition只有一个参数condition,它的类型为ConditionBase,用来描述一个需要等待满足的条件。
  成员函数updateCondition执行完成一个UI元数据缓冲区堆栈操作之后,还会调用当前应用进程的SharedClient单例client的成员变量cv所描述的一个条件变量的成员函数broadcast,用来唤醒那些在当前应用进程的SharedClient单例client的成员变量lock所描述的一个互斥锁上等待的其它线程,以便它们可以继续执行自己的操作,这样,SharedBufferBase类的成员函数updateCondition就可以和前面介绍的成员函数waitCondition对应起来。

9. UpdateBase的三个子类QueueUpdate、DequeueUpdate和RetireUpdate
  QueueUpdate和DequeueUpdate两个子类是Android应用程序这一侧使用的,前者用来向一个UI元数据缓冲区堆栈的待渲染队列增加一个缓冲区,而后者用来从一个UI元数据缓冲区堆栈出栈一个空闲的缓冲区。
  RetireUpdate类是在SurfaceFlinger服务这一侧使用的,用来从一个UI元数据缓冲区堆栈的待渲染队列出栈一个缓冲区,以便可以将与它所对应的图形缓冲区渲染到设备显示屏去。

10. BufferInfo
  成员变量mDirty用来描述一个Surface的元数据是否发了变化,例如,它的大小、像素格式等是发生了变化。如果发生了变化,那么它的值就会不等于0。

11. GLSurfaceView.Render
  成员函数onSurfaceCreated 在画布被创建时调用,初始化背景色;
  onSurfaceChanged 在画布被改变时调用,变换坐标、窗口比例;
  onDrawFrame实现图形的绘制。