Android的Graphic系统分析之skia讲解学习Word文档下载推荐.docx
- 文档编号:22775798
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:16
- 大小:22.28KB
Android的Graphic系统分析之skia讲解学习Word文档下载推荐.docx
《Android的Graphic系统分析之skia讲解学习Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Android的Graphic系统分析之skia讲解学习Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。
∙show/hide:
显示隐藏操作
∙setSize/setPosition:
设置大小和位置
∙SetLayer:
设置图层
∙freeze/unfreeze:
冻结与去冻结操作,即是否更新屏幕
∙SetAlpha:
设置Alpha通道,即设置透明等级
∙SetMatrix:
设置平移矩阵
∙setFlags:
设置其它标志
这些SurfaceControl类的功能实现仅仅是对SurfaceComposerClient的简单封装。
可以通过SurfaceComposerClient的函数获取Display的个数、高、宽、旋转方向以及其它信息。
它是通过ComposerService中的控制块信息来实现的。
ScreenshotClient包含屏幕截屏宽(mWidth)和高(mHeight)以及像素格式(PixelFormat),截图数据保存在IMemoryHeap中(mHeap)。
它是调用ISurfaceComposer的captureScreen函数来实现的。
Surface
Surface类继承自EGLNativeBase模板类,因此它实际上一个ANativeWindow,只不过该模板给它添加了引用计数功能,并可安全地进行类型转换。
classSurface
:
publicEGLNativeBase<
ANativeWindow,Surface,RefBase>
上层应用程序各有自己的surface,因此多个surface会同时存在,这些surface在本侧就是SurfaceComposerClient所代表,它们可以添加到Composer类维护的列表中。
SurfaceControl会使用SurfaceClient和Surface去完成相应功能,SurfaceControl的getSurface函数会创建Surface,从而也会导致SurfaceClient的创建,进而相应的ISurfaceClientComposer等会被创建。
ISurfaceComposer
ISurfaceComposer是SurfaceFlinger在client侧的一个binder,提供的接口用于对整个屏幕的全局性的管理,如方向旋转、屏幕快照、屏幕事件、屏幕更新的冻结与去冻结等。
它提供的接口对应的枚举类型有:
enum{
//Note:
BOOT_FINISHEDmustremainthisvalue,itiscalledfrom
//JavabyActivityManagerService.
BOOT_FINISHED=IBinder:
FIRST_CALL_TRANSACTION,
CREATE_CONNECTION,
CREATE_CLIENT_CONNECTION,
GET_CBLK,
OPEN_GLOBAL_TRANSACTION,
CLOSE_GLOBAL_TRANSACTION,
SET_ORIENTATION,
FREEZE_DISPLAY,
UNFREEZE_DISPLAY,
SIGNAL,
CAPTURE_SCREEN,
TURN_ELECTRON_BEAM_OFF,
TURN_ELECTRON_BEAM_ON
};
它是通过Binder进行IPC通讯的接口,BpSurfaceComposer是client一侧,BnSurfaceComposer是service一侧。
它们都继承自各自的模板类BpInterface和BnInterface,这两个模板类完成双重继承的功能,一个继承IPC通讯的API接口,一个继承Binder功能。
RefBase用于索引计数,类IInterface和ISurface定义了IPC通讯的接口API,IBinder/BBinder使双方具备Binder通讯功能。
其中CREATE_CONNECTION和REATE_CLIENT_CONNECTION打开关闭一个Transaction,在打开和关闭的过程中,可以设置状态,实现窗口管理。
状态变化更改是在一个事务(transaction)中进行的。
其类继承关系如下:
根据Binder继承关系规则,client侧的接口调用通过最终是由Bn侧的子类完成。
我们就可以知道它的它动态的调用关系如下,左侧的调用者一般可以通过指向ISurfaceComposer的智能指针将操作将调用到SurfaceFlinger类的成员函数。
ComposerService对IsurfaceComposer进行了包裹,使用它的getComposerService函数可以获取IsurfaceComposer。
另外,ComposerService还包含了surface_flinger_cblk_t控制块信息,该内存块位于Ashem内存上,由SurfaceFlinger申请,并依据display硬件信息填充字段值。
client端程序通过读取它,即可得到各display的信息。
structdisplay_cblk_t
{//dispaly的各项信息
uint16_tw;
uint16_th;
uint8_tformat;
uint8_torientation;
uint8_treserved[2];
floatfps;
floatdensity;
floatxdpi;
floatydpi;
uint32_tpad[2];
structsurface_flinger_cblk_t//4KBmax
{//控制信息块
uint8_tconnected;
uint8_treserved[3];
uint32_tpad[7];
display_cblk_tdisplays[SharedBufferStack:
NUM_DISPLAY_MAX];
//最多4个display
在SufraceFlinger的readyToRun会申请内存,并依据DisplayHardWare中得到display信息:
//createthesharedcontrol-block
mServerHeap=newMemoryHeapBase(4096,
MemoryHeapBase:
READ_ONLY,“SurfaceFlingerread-onlyheap”);
//分配内存,没有指定设备名称或描述符fd,默认使用AShem上的内存
LOGE_IF(mServerHeap==0,“can’tcreatesharedmemorydealer”);
mServerCblk=//得到内存基址
static_cast<
surface_flinger_cblk_t*>
(mServerHeap->
getBase());
LOGE_IF(mServerCblk==0,“can’tgettosharedcontrolblock’saddress”);
new(mServerCblk)surface_flinger_cblk_t;
//initializeprimaryscreen
//(otherdisplayshouldbeinitializedinthesamemanner,but//asynchronously,astheycouldcomeandgo.Noneofthisissupportedyet).
constGraphicPlane&
plane(graphicPlane(dpy));
constDisplayHardware&
hw=plane.displayHardware();
constuint32_tw=hw.getWidth();
constuint32_th=hw.getHeight();
constuint32_tf=hw.getFormat();
hw.makeCurrent();
//initializethesharedcontrolblock
mServerCblk->
connected|=1<
<
dpy;
display_cblk_t*dcblk=mServerCblk->
displays+dpy;
memset(dcblk,0,sizeof(display_cblk_t));
//给结构体赋值,同一块内存上,client侧可以立即得到
dcblk->
w=plane.getWidth();
h=plane.getHeight();
format=f;
orientation=ISurfaceComposer:
eOrientationDefault;
xdpi=hw.getDpiX();
ydpi=hw.getDpiY();
fps=hw.getRefreshRate();
density=hw.getDensity();
IsurfaceComposerClient
ISurfaceComposerClient用于通过Binder与SurfaceFlinger交互,创建和销毁ISurface,它也可以获取控制块。
在SurfaceFlinger侧会有两种类型的surface:
Client(用于创建销毁ISurace)和UserClient(用于获取控制块进行通讯)。
它提供的接口对应的枚举类型如下:
GET_CBLK=IBinder:
GET_TOKEN,
CREATE_SURFACE,
DESTROY_SURFACE,
SET_STATE
动态调用关系图,调用者通过对IsurfaceComposerClient的引用,最后由SufaceFlinger进程中的Client或UserClient来完成:
ISurface
Isurface提供了一个与SufaceFlinger侧进行IPC交互的接口,它主要功能是操作缓冲区。
我们可以从ISurface这个纯虚类中看出起定义的接口操作:
REGISTER_BUFFERS=IBinder:
UNREGISTER_BUFFERS,
POST_BUFFER,//one-waytransaction
CREATE_OVERLAY,
REQUEST_BUFFER,
SET_BUFFER_COUNT,
这些枚举就是所支持的接口操作,相应地对应着纯虚成员函数。
我们可以望文生义理解其含义。
如下图,BpSurface是client一侧,BnSurface是service一侧。
类继承关系图
动态调用关系如下图所示:
sp<
Isurface>
Surfaceflinger制块
在文件SharedBufferStack.h中定义了一个结构体,它是为了通过共享内存的方式快速获取系统所有display物理信息,这个控制块由结构体surface_flinger_cblk_t定义:
structdisplay_cblk_t//显示控制块,Android中默认支持最多4个diaplay
{
//display的宽
//display的高
//格式
//旋转方向
//保留字节
//刷新率
//密度
//x方向上的解析度,每英寸的点阵数(dots/inch)
//y方向上的解析度
//填充字节
//是否连接
//保留字节
//支持最多4个的display
Java层在创建一个SurfaceSession实例时,建立到server侧的连接,这个连接的动作实际就是分配内存、创建surface_flinger_cblk_t对象并初始化获得初始值、以及可以跨进程访问的过程。
具体过程是:
在client一侧,创建SurfaceSession时,会创建一个SurfaceComposerClient对象,接着会调用SurfaceComposerClient:
onFirstRef:
voidSurfaceComposerClient:
onFirstRef()//第一次创建对象时被调用
ISurfaceComposer>
sm(getComposerService());
//导致获取全局控制块
if(sm!
=0){
ISurfaceComposerClient>
conn=sm->
createConnection();
//创建一个连接,surfaceflinger侧会创建一个Client对象
if(conn!
mClient=conn;
Composer:
addClient(this);
mPrebuiltLayerState=newlayer_state_t;
mStatus=NO_ERROR;
}
在上面的代码中,先在ComposerService的构造函数中获取surfaceflinger控制块。
ComposerService(也就是ISurfaceComposer的Wrapper)构造函数获取surfaceflinger控制块的过程如下:
ComposerService:
ComposerService()
Singleton<
ComposerService>
(){
constString16name(“SurfaceFlinger”);
while(getService(name,&
mComposerService)!
=NO_ERROR){
usleep(250000);
mServerCblkMemory=mComposerService->
getCblk();
//获取IMemoryHeap
mServerCblk=static_cast<
surface_flinger_cblk_tvolatile*>
(
mServerCblkMemory->
//在IMemoryHeap中的基址指针转换为surface_flinger_cblk_t指针
另外,SurfaceComposerClient的onFirstRef会创建一个connection,它的目的是创建代理对象,用于BinderIPC通讯,ISurfaceComposerClient接口强指针指向该代理对象。
在server侧,它只是调用Client(也就是ISurfaceComposerClient接口在server侧的真正实现者)构造函数创建一个Client对象进行类型转换后返回。
而实际的内存分配是在server侧创建SurfaceFlinger后准备运行其工作线程时完成的,见SurfaceFlinger:
readyToRun函数:
status_tSurfaceFlinger:
readyToRun()
LOGI(“SurfaceFlinger’smainthreadreadytorun.”
“InitializinggraphicsH/W…”);
//weonlysupportonedisplaycurrently
intdpy=0;
//initializethemaindisplay
GraphicPlane&
DisplayHardware*consthw=newDisplayHardware(this,dpy);
plane.setDisplayHardware(hw);
//创建共享控制块,因未指定在何处分配内存,默认的是ashmem上
(mServerHeap->
//获取基址
//(otherdisplayshouldbeinitializedinthesamemanner,but
//asynchronously,astheycouldcomeandgo.Noneofthisissupportedyet).
//下面是为共享控制块赋值
……//省略部分代码
它为该控制块在ashmem上分配内存并对其初始化赋值。
SharedClient控制块
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android Graphic 系统分析 skia 讲解 学习