1 Surfaceflinger线程
Surfaceflinger是一个类,同时又是线程,该线程通过循环,不断计算并刷新当前屏幕需要的显示内容。Surfaceflinger线程属于SystemServer进程,也就是在SystemServer进程中启动了Surfaceflinger线程。
Surfaceflinger中保存着各种layer,其主要工作就是负责各种layer的融合,因此可看做一个用于维护各种layer的线程。
启
动Android线程需要提供两个接口,一是readyToRun(),该函数定义了线程循环前需要初始化的内容;二是threadLoop(),每个线
程都必须实现,该函数定义了线程执行的内容,如果该函数返回true,线程会继续调用threadLoop(),如果返回false,线程将退出。
2 初始化
Surfaceflinger类的构造函数会执行init(),该函数输出Surfaceflinger启动信息,并配置一些调试信息。接着执行readyToRun(),初始化整个显示系统。
readyToRun()调用过程如下:
(1)执行new DisplayHardware(this, dpy),通过DisplayHardware初始化Framebuffer、EGL并获取OpenGL ES信息。
(2)创建共享的内存控制块。
(3)将EGL与当前屏幕绑定。
(4)初始化共享内存控制块。
(5)初始化OpenGL ES。
(6)显示开机动画。
3 核心数据结构
State mCurrentState;
当前更新的状态
State mDrawingState;
正在屏幕上绘制的状态
LayerVector layersSortedByZ;
保存layer的列表,类似于Z轴,mCurrentState和mDrawingState分别拥有一个列表。
4 主循环threadLoop()
通过流程图可以看到threadLoop()都做了哪些操作。
4.1 waitForEvent函数
waitForEvent函数将超时时间设置为5秒钟,并等待系统事件发生。在超时前若有事件发生则立即返回,若发生超时将输出警告信息,上层一般会处理这个问题。
4.2 handleConsoleEvents函数
该函数被执行的几率较低,主要用于处理控制台事件。
4.3 handleTransaction函数
该函数将遍历Surfaceflinger拥有的每一个layer,检查是否有layer的属性改变,主要执行以下工作:
(1)获取mCurrentState.layersSortedByZ及layer的数目。
(2)遍历所有layer,获取layer对应的参数,判断是否有layer的属性改变和是否有需要显示的layer。
(3)更新主屏幕参数:
如果屏幕需要旋转,则需更新所有可见区域和共享控制块,并计算旋转参数;
判断主屏幕是否需要被冻结;
判断是否有新加入的layer;
去除不再需要的layer,通过ditchedLayers.add(layer)释放资源;
(4)通过广播更新所有改变。
4.4 handlePageFlip函数
该函数主统计所有layer的信息,针对需要的layer进行重绘,并计算屏幕实际可显示区域。
(1)调用lockPageFlip(currentLayers)
遍
历currentLayers包含的所有layer,依次调用每层layer对应的lockPageFlip函数。首先通过retireAndLock函
数取得新的frontbuffer,然后获取并计算脏的区域,最后调用reloadTexture函数更新这些区域。
(2)
如果有需要显示的layer,调用computeVisibleRegions函数计算经过混合后每个layer的显示区域。每一个layer拥有三片区
域,分别为opaqueRegion、visibleRegion和coveredRegion,主屏幕则拥有aboveOpaqueLayers、
aboveCoveredLayers。在遍历每一层layer时,要计算没个layer对应的区域,同时同步更新主屏幕的
aboveOpaqueLayers和aboveCoveredLayers。
(3)调用unlockPageFlip(currentLayers)
遍历currentLayers包含的所有layer,依次调用每层layer对应的unlockPageFlip函数,完成layer到屏幕的坐标变换。
4.5 handleRepaint函数
handlePageFlip更新并计算每一个独立layer的显示区域,handleRepaint则负责将每一个layer经过计算的显示区域数据搬运至屏幕的显存中。
(1)根据不同的屏幕类型,设定更新模式,有部分更新、缓存更新、矩形框交换和全屏更新。
(2)调用composeSurfaces(mDirtyRegion)
该函数将遍历每一层layer,调用layer对应的onDraw接口,将数据从layer的缓存搬运至屏幕的显存中。
4.6 hw.compositionComplete函数
该函数会调用到gralloc模块的fb_compositionComplete接口,是提供给屏幕的回调接口,目前并没有实现任何功能,根据采用屏幕的不同可能需要填充相应操作。
4.7 unlockClients函数
unlockClients函数将遍历每一层layer,调用finishPageFlip释放layer用于的共享控制块。
4.8 postFramebuffer函数
handleRepaint函数执行的搬运操作实际将显示数据搬运至屏幕的后缓冲中,postFramebuffer最终将调用到eglSwapBuffers(dpy, surface),交换屏幕的后缓冲和前缓冲,实现显示更新。
4.9 另一条路线
如果hw.canDraw返回错误或者屏幕此时被冻结,那么将无法进行数据更新,此时将都另外一条路线,直接调用unlockClients,并休眠16667微秒。如果显示出现问题,16667微秒将保证每秒最多执行60次threadLoop函数。
分享到:
相关推荐
资源来自pypi官网。 资源全名:threadloop-0.3.0.tar.gz
详情:https://blog.csdn.net/automoblie0/article/details/122693622
面向小白学习法——Thread和Runnable,扩展Callable! Thread和Runnable的区别 (Callable扩展) 线程 Thread Runnable 扩展——Callable 面向小白学习法——Thread和Runnable,扩展Callable! Thread和...
通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到spu时间片,就开始执行run()方法,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行...
c++ thread_local(csdn)————程序
在典型的图形应用程序中,您有一个在初始线程中运行的主循环。 主循环处理各种任务,例如呈现用户界面、更新程序逻辑等。 这工作正常,除非您决定异步运行某些东西,例如加载文件。 在主线程中执行这样一个持久的...
1.使用RT-Thread 系统实现DIY数字仪表(一)——STM32CUBMX5.6移植touchGFX4.13 2.使用RT-Thread 系统实现DIY数字仪表(二)——把TouchGFX移植到RTThread系统 3.使用RT-Thread 系统实现DIY数字仪表(三)——RT...
1.3.3 continue语句——继续执行下一个循环 31 1.3.4 do…while语句——循环语句 31 1.3.5 for语句——循环语句 32 1.3.6 foreach语句——枚举一个集合的元素 33 1.3.7 goto语句——跳转到标签 34 1.3.8 if…else...
需要本地安装JDK并配置JAVA环境变量。 之后使用java -jar jca469.jar即可打开工具。 直接将dump出来的堆栈信息,打开,便可分析。
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口(csdn)————程
熟悉Windows编程的朋友可能知道Windows程序是消息驱动的,并且有全局的消息循环系统。而Android应用程序也是消息驱动的,按道理来说也应该提供消息循环机制。实际上谷歌参考了Windows的消息循环机制,也在Android...
本手册提供了有关ThreadX——Express Logic 公司高性能实时内核的详尽信息。 指南之意义 本手册适用于嵌入式实时软件的开发者。开发者应熟悉标准实时操作系统的功能及C 程序设计。 结构 手册包括七章,五个附录以及...
1.使用RT-Thread 系统实现DIY数字仪表(一)——STM32CUBMX5.6移植touchGFX4.13 2.使用RT-Thread 系统实现DIY数字仪表(二)——把TouchGFX移植到RTThread系统 3.使用RT-Thread 系统实现DIY数字仪表(三)——RT...
1.使用RT-Thread 系统实现DIY数字仪表(一)——STM32CUBMX5.6移植touchGFX4.13 2.使用RT-Thread 系统实现DIY数字仪表(二)——把TouchGFX移植到RTThread系统 3.使用RT-Thread 系统实现DIY数字仪表(三)——获取温...
C#创建线程与循环的例子,此为演示代码,创建新线程,并创建ThreadStart委托对象,消息传输方法AddMsg,在方法中使用循环实现传输功能,在循环中创建线程,在循环中创建并使用线程,传输一行,并将该行删除,点击...
1.使用RT-Thread Studio实现DIY数字仪表(一)——STM32CUBMX5.6移植touchGFX4.13 2.使用RT-Thread Studio实现DIY数字仪表(二)——把TouchGFX移植到RTThread系统 3.使用RT-Thread Studio实现DIY数字仪表(三)——...
8、Worker Thread ———— 等到工作来,来了就工作 9、Future ———— 先给您这张提货单 10、Two-Phase Termination ———— 快把玩具收拾好,去睡觉吧 11、Thread-Specific Storage ———— 每个线程的保管箱 ...
———————————————————————————————————————— —— https://bbs.pinggu.org/thread-8113337 -1-1.html 【重要】国家社科基金申请书与论证活页 https://bbs .pinggu.org/...