Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析

Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析

ID:37708744

大小:597.50 KB

页数:60页

时间:2019-05-29

Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析_第1页
Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析_第2页
Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析_第3页
Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析_第4页
Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析_第5页
资源描述:

《Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析在前面一篇文章中,我们分析了Android应用程序请求SurfaceFlinger服务创建Surface的过程。有了Surface之后,Android应用程序就可以在上面绘制自己的UI了,接着再请求SurfaceFlinger服务将这个已经绘制好了UI的Surface渲染到设备显示屏上去。在本文中,我们就将详细分析Android应用程序请求SurfaceFlinger服务渲染Surface的过程。Android应用程序在请求SurfaceFlinger服务渲

2、染一个Surface之前,首先要将该Surface作为当前活动的绘图上下文,以便可以使用OpengGL库或者其它库的API来在上面绘制UI,我们以Android系统的开机动画应用程序bootanim为例,来说明这个问题。从前面一文可以知道,Android系统的开机动画应用程序bootanim是在BootAnimation类的成员函数readyToRun中请求SurfaceFlinger服务创建Surface的。这个Surface创建完成之后,就会被设置为当前活动的绘图上下文,如下所示:[cpp]viewplaincopy在CODE上查看代码片

3、派生到我的代码片status_tBootAnimation::readyToRun(){......//createthenativesurfacespcontrol=session()->createSurface(getpid(),0,dinfo.w,dinfo.h,PIXEL_FORMAT_RGB_565);......sps=control->getSurface();......//initializeopenglandeglconstEGLintattribs[]={EGL_DEP

4、TH_SIZE,0,EGL_NONE};......EGLConfigconfig;EGLSurfacesurface;EGLContextcontext;EGLDisplaydisplay=eglGetDisplay(EGL_DEFAULT_DISPLAY);eglInitialize(display,0,0);EGLUtils::selectConfigForNativeWindow(display,attribs,s.get(),&config);surface=eglCreateWindowSurface(display,config

5、,s.get(),NULL);context=eglCreateContext(display,config,NULL,NULL);......if(eglMakeCurrent(display,surface,surface,context)==EGL_FALSE)returnNO_INIT;......}BootAnimation类的成员函数readyToRun首先调用eglGetDisplay和eglInitialize函数来获得和初始化OpengGL库的默认显示屏,接着再调用EGLUtils::selectConfigForNativ

6、eWindow函数来获得前面所创建的一个Surface(由sp指针s来描述)的配置信息。有了这些信息之后,接下来就分别调用eglCreateWindowSurface和eglCreateContext函数来创建一个适用于OpenGL库使用的绘图表面surface以及绘图上下文context,最后就可以调用eglMakeCurrent函数来将绘图表面surface和绘图上下文context设置为当前活动的绘图表面和绘图上下文,这就相当于是将前面请求SurfaceFlinger服务创建的一个Surface设置为当前活动的绘图上下

7、文了。完成了上述操作之后,Android系统的开机动画应用程序bootanim就可以继续使用OpengGL库的其它API来在当前活动的Surface上绘制UI了,不过,通过前面一文的学习,我们知道,此时SurfaceFlinger服务为Android应用程序创建的Surface只有UI元数据缓冲区,而没有UI数据缓冲区,即还没有图形缓冲区,换句来说,就是还没有可以用来绘制UI的载体。那么,这些用来绘制UI的图形缓冲区是什么时候创建的呢?从前面一文可以知道,每一个Surface都有一个对应的UI元数据缓冲区堆栈,这个UI元数据缓冲区堆栈是使用一

8、个SharedBufferStack来描述的,如图1所示。从图1就可以看出,每一个UI元数据缓冲区都可能对应有一个UI数据缓冲区,这个UI数据缓冲区又可以称为图形缓

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。