App的启动过程(6)面向应用程序的本地窗口surface

来源:互联网 发布:网侠安卓电视直播软件 编辑:程序博客网 时间:2024/06/05 17:39

接下来分析下面向应用程序的本地窗口surface,这里的surface不是Surface.java,而是指Surface.cpp,它承担着应用程序中的UI显示需求,一方面要向上层提供绘制图像的画板,也就是GraphicBuffer,另一方面配合surfaceflinger完成收集应用程序的图像数据。当然,应用程序是不可能直接使用surface(后者说bufferQueue,图形缓冲区Graphicbuffer实际是由bufferqueue来管理的)的,会有层层封装。先看下应用程序端的surface是怎么申请。

         Surface有几种状态,分别对应了窗口的绘制状态:

/*WindowStateAnimator.java*/

String drawStateToString() {

         switch(mDrawState) {

//surface还没有创建

                   caseNO_SURFACE: return "NO_SURFACE";

//surface已经创建,但窗口还没有开始绘制,surface实际处于隐藏状态

                  case DRAW_PENDING: return"DRAW_PENDING";

//窗口已经第一次绘制完,但surface还没开始显示,它将在下一次的layout中被显示出来

                   caseCOMMIT_DRAW_PENDING: return "COMMIT_DRAW_PENDING";

//窗口的绘制请求已经提交,但是surface还没有实际显示出来

                   caseREADY_TO_SHOW: return "READY_TO_SHOW";

//窗口已经第一次显示在屏幕上

                   caseHAS_DRAWN: return "HAS_DRAWN";

}

}

应用进程申请一个surface的过程:

ViewRootImpl在执行performTraversals时,会调用relayoutwindow进而通过IwindowSessionrelayout方法,实际是通过wmssurfaceflinger申请surface,通过参数mSurface返回结果。

mWindowSession.relayout(…mSurface)@ViewRootImpl.javaà

IWindowSession对应的服务端实现是Session.java

relayout()@Session.java à直接调用了wms的函数:mService.relayoutWindow()

/*WindowManagerService.java*/

public int relayoutWindow(…, SurfaceoutSurface){

//创建了WindowSurfaceController

         result= createSurfaceControl(outSurface, result, win, winAnimator);

}

private int createSurfaceControl(SurfaceoutSurface,){

//通过WindowStateAnimator.java创建WindowSurfaceController的构造函数中创建了SurfaceControl,来管理surface,包括surface的创建和销毁

         WindowSurfaceControllersurfaceController = winAnimator.createSurfaceLocked();

         surfaceController.getSurface(outSurface);

}

void getSurface(Surface outSurface)@WindowSurfaceController.java {

outSurface.copyFrom(mSurfaceControl);

}

//通过jni调用本地类的实现,生成本地层的surface

copyFrom ()@Surface.java{

         longnewNativeObject = nativeCreateFromSurfaceControl(surfaceControlPtr);

}

转到本地代码android_view_Surface.cpp

static jlongnativeCreateFromSurfaceControl(…jlong surfaceControlNativeObj) {

//这里调用的是surfacecontrol.cpp中的getsurface

         sp<SurfaceControl>ctrl(reinterpret_cast<SurfaceControl *>(surfaceControlNativeObj));

         sp<Surface>surface(ctrl->getSurface());

//将本地的surface(c++)对象记录到javasurface对象变量中

         returnreinterpret_cast<jlong>(surface.get());

}

sp<Surface>SurfaceControl::getSurface() @SurfaceControl.cpp{

//创建了本地层的surface,并传入参数sp<IGraphicBufferProducer>IGraphicBufferProducersurfaceBufferQueue交互的Binder通道,dequeuebufferqueuebuffer都是通过IGraphicBufferProducer间接实现。

         mSurfaceData= new Surface(mGraphicBufferProducer, false);

}

IGraphicBufferProducer在服务端的实现是BufferQueueProducer.cpp从继承关系可以开的出来:

class BufferQueueProducer : publicBnGraphicBufferProducer,…

看一下Surface作为应用程序端的本地窗口,是怎样履行ANativeWindow这个窗口协议的。

首先继承了ANativeWindow

class Surface : publicANativeObjectBase<ANativeWindow, Surface, RefBase>

然后,surface的构造函数:

Surface::Surface(const sp<IGraphicBufferProducer>&bufferProducer, bool controlledByApp){

//ANativeWindow中的函数指针赋值,

         ANativeWindow::setSwapInterval  = hook_setSwapInterval;

         ANativeWindow::dequeueBuffer    = hook_dequeueBuffer;

ANativeWindow::cancelBuffer     = hook_cancelBuffer;

ANativeWindow::queueBuffer      = hook_queueBuffer;

         ANativeWindow::query            = hook_query;

ANativeWindow::perform          = hook_perform;

}

Surface内部重要的成员变量:

sp<IGraphicBufferProducer>mGraphicBufferProducer;就是在创建surface对象时传入的那个参数,surface就是通过它来获取buffer的,同时也是surfacesurfaceflinger真正有联系的一个对象。

BufferSlot mSlots[NUM_BUFFER_SLOTS];这个数组的最大值是64,但是实际使用的具体值时根据setMaxDequeuedBufferCount来设置的,通常是双缓冲是2,三缓冲就是3surface内部用于存储buffer的地方,BufferSlot内部由一个GraphicBuffer和一个dirtyRegion组成。

   struct BufferSlot {

       sp<GraphicBuffer> buffer;

       Region dirtyRegion;

   };

阅读全文
0 0
原创粉丝点击