App的启动过程(6)面向应用程序的本地窗口surface
2017-06-01 17:17
381 查看
接下来分析下面向应用程序的本地窗口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进而通过IwindowSession的relayout方法,实际是通过wms向surfaceflinger申请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++)对象记录到java层surface对象变量中
returnreinterpret_cast<jlong>(surface.get());
}
sp<Surface>SurfaceControl::getSurface() @SurfaceControl.cpp{
//创建了本地层的surface,并传入参数sp<IGraphicBufferProducer>,IGraphicBufferProducer是surface与BufferQueue交互的Binder通道,dequeuebuffer,queuebuffer都是通过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的,同时也是surface跟surfaceflinger真正有联系的一个对象。
BufferSlot mSlots[NUM_BUFFER_SLOTS];这个数组的最大值是64,但是实际使用的具体值时根据setMaxDequeuedBufferCount来设置的,通常是双缓冲是2,三缓冲就是3,surface内部用于存储buffer的地方,BufferSlot内部由一个GraphicBuffer和一个dirtyRegion组成。
struct BufferSlot {
sp<GraphicBuffer> buffer;
Region dirtyRegion;
};
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进而通过IwindowSession的relayout方法,实际是通过wms向surfaceflinger申请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++)对象记录到java层surface对象变量中
returnreinterpret_cast<jlong>(surface.get());
}
sp<Surface>SurfaceControl::getSurface() @SurfaceControl.cpp{
//创建了本地层的surface,并传入参数sp<IGraphicBufferProducer>,IGraphicBufferProducer是surface与BufferQueue交互的Binder通道,dequeuebuffer,queuebuffer都是通过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的,同时也是surface跟surfaceflinger真正有联系的一个对象。
BufferSlot mSlots[NUM_BUFFER_SLOTS];这个数组的最大值是64,但是实际使用的具体值时根据setMaxDequeuedBufferCount来设置的,通常是双缓冲是2,三缓冲就是3,surface内部用于存储buffer的地方,BufferSlot内部由一个GraphicBuffer和一个dirtyRegion组成。
struct BufferSlot {
sp<GraphicBuffer> buffer;
Region dirtyRegion;
};
相关文章推荐
- Android应用程序窗口(Activity)的绘图表面(Surface)的创建过程分析
- Android应用程序(app)进程启动过程的源代码分析
- Android应用程序窗口(Activity)的绘图表面(Surface)的创建过程分析
- MFC程序的启动过程——先全局对象theApp(第一入口),后WinMain(真正入口),会引爆pApp->InitInstance从而创建窗口(程序员入口)
- App的启动过程(4)在WMS中注册窗口
- Android应用程序窗口(Activity)的绘图表面(Surface)的创建过程分析
- App的启动过程(9)surfaceflinger对vsync的处理
- android应用程序窗口框架学习(3)-应用程序的进程的启动过程
- 分析点击android桌面app图标启动应用程序的过程
- Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起(写的很好,这个不是从启动app说的,说的是UI是怎么绘制的)
- Android应用程序窗口(Activity)的绘图表面(Surface)的创建过程分析
- Android应用程序窗口(Activity)的绘图表面(Surface)的创建过程分析
- Symbian应用程序的启动过程
- 【转】C++编译过程中"没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题"? 的彻底解决
- IDE-----VS2005运行过程中"没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题"? 的解决
- iPhone开发进阶(3) — iPhone应用程序的启动过程
- Symbian应用程序的启动过程
- C++编译过程中"没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题"? 的彻底解决
- C++编译过程中"没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题"? 的彻底解决
- 在应用程序中使用启动屏幕和登陆窗口