网上关于android。fence的资料好少啊。差点儿没有,可是这个机制又在GUI系统中起着关键的数据,于是自己通读源代码和凝视。与大家分享下Fence究竟是怎么回事?

Fence即栅栏。栅栏的角色与它的名字很类似.一组线程能够使用栅栏来集体进行相互同步;在本质上,每一个线程在到达某种周知的状态时调用栅栏的wait()方法,堵塞起来,以等待其他全部參与线程调用wait()方法表明它们也到达了这个状态.一旦全部的线程都到达栅栏,它们就会集体解除堵塞,并一起继续运行;引起程序调用栅栏的wait()方法进行堵塞的那个状态叫做栅栏状态;

本篇主要讲述fence在surfaceflinger中的应用的理论基础。确切的说fence在producer和consumer对buffer处理的过程中是怎样协调他们同步的工作,从而保证buffer内容的准确性。而不会被篡改。

首先我们知道一个buffer有下面几种状态:

FREE->DEQUEUED->QUEUED->ACQUIRED->FREE

FREE状态时,producer就能够申请他了吗?答案是错的,他须要等一个signal。也就是NO_FENCE这个信号,由于有可能上一次申请的buffer正在被consumer作业中,所以要等待consumer发出finish的信号,而此时FREE状态下的buffer就好像被栅栏拦住了,这里是用Fence中wait()或者waitForever()方法。等一个NO_FENCCE信号,栅栏就会打开。进入到下一流程。

DEQUEUED是指producer已经申请了一个buffer从队列中出来了,还没有入队列或者取消buffer。这个状态下的buffer。producer想对其进行改动也就是填入UI数据时,必须等一个NO_FENCE信号。由于有可能其它owner正在对它进行操作。当信号一到,poducer就能够对其进行操作,操作完毕后发出一个NO_FENCE信号。

QUEUED状态下。也就是把buffer入队列,只是在这个操作前须要等一个NO_FENCE信号,就比方上一步dequeueBuffer完毕之后发的NO_FENCE.收到信号后才进行入队列操作或者取消buffer操作。

这个时候它的owner就变成BufferQueue了。

ACQUIRED状态也就是producer已经对buffer填充完毕,与前面一样它也要等到一个NO_FENCE信号,然后consumer才干对其进行操作。

操作完毕后会释放buffer,然后发出一个NO_FENCE
信号。

这下大概知道Fence的工作流程了吧。

当先前的全部者发出一个工作被完毕的时候,fence就会发一个信号。当一个buffer是free的时候,消费者已经完毕了从buffer里读出来东西或者假设它在queuebuffer一些操作之后调用了cancelBuffer当生产者完毕了对buffer的写操作。假设当buffer处于QUEUED状态时,这表明了生产者完毕了对buffer的填充。当buffer处于DEQUEUE或ACQUIRED状态时,fence已经被传给了消费者或者生产者连同buffer的所属者。这个时候fence被置为NO_FENCE.

Android 4.4 Fence在SurfaceFlinger中的应用的更多相关文章

  1. Android 12(S) 图像显示系统 - SurfaceFlinger之VSync-上篇(十六)

    必读: Android 12(S) 图像显示系统 - 开篇 一.前言 为了提高Android系统的UI交互速度和操作的流畅度,在Android 4.1中,引入了Project Butter,即&quo ...

  2. Android 12(S) 图像显示系统 - SurfaceFlinger GPU合成/CLIENT合成方式 - 随笔1

    必读: Android 12(S) 图像显示系统 - 开篇 一.前言 SurfaceFlinger中的图层选择GPU合成(CLIENT合成方式)时,会把待合成的图层Layers通过renderengi ...

  3. Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析

    参考:Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析 一句话概括一下Android应用程序显示的过程:Android应用程序调用SurfaceFlin ...

  4. [转]Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划

    转自:Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划 前面我们从Android应用程序与SurfaceFlinger服务的关系出发,从侧面简单学习了Surfa ...

  5. Android系统Surface机制的SurfaceFlinger服务的线程模型分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8062945 在前面两篇文章中,我们分析了Sur ...

  6. Android系统Surface机制的SurfaceFlinger服务对帧缓冲区(Frame Buffer)的管理分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8046659 在前文中,我们分析了Surface ...

  7. Android系统Surface机制的SurfaceFlinger服务的启动过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8022957 在前面一篇文章中,我们简要介绍了A ...

  8. Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8010977 前面我们从Android应用程序与 ...

  9. surfaceflinger中各个layer的排序

    surfaceflinger的主要工作就是负责把上层传递下来的各个不同的layer进行composition. 这里,我们来讨论一下各个layer在surfaceflinger中的上下排序关系和相关的 ...

随机推荐

  1. angularjs $location 服务

    <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...

  2. poj_1974,最长回文字串manacher

    时间复杂度为O(n),参考:http://bbs.dlut.edu.cn/bbstcon.php?board=Competition&gid=23474 #include<iostrea ...

  3. hdoj--1301--Jungle Roads(克鲁斯卡尔)

    Jungle Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tot ...

  4. nyoj--767--因子和(模拟)

    因子和 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 题目很简单明了,给你一个数n,判断它是不是素数,如果是素数就输出"Yes",如果不是素数则输出 ...

  5. Dictionaries and lists

    Lists can appear as values in a dictionary. For example, if you were given a dictionary that maps fr ...

  6. ThinkPhp5-PHPExcel导出数据

    PHP-Excel 标签(空格分隔): php 类库下载地址:https://codeload.github.com/PHPOffice/PHPExcel/zip/1.8 php导出excel表格数据 ...

  7. 25.不改变原生数据的STL algorithm

    通过仿函数for_each操作 vector<,,,, }; list<double> db{ 1.1,2.2,3.3,4.4,5.5 }; //循环算法,算法的泛型 print p ...

  8. 实时监控Cat之旅~对请求是否正常结束做监控(分布式的消息树)

    对基于请求的分布式消息树的分析 在MVC时有过滤器System.Web.Mvc.ActionFilterAttribute,它可以对action执行的整个过程进行拦截,执行前与执行后我们可以注入自己的 ...

  9. js base64加密与C#后台base64解密

    js代码 function encode64(input) { var output = ""; var base = new Base64(); var output = bas ...

  10. PostgreSQL Replication之第四章 设置异步复制(7)

    4.7 冲突管理 在PostgreSQL中,流复制数据仅在一个方向流动.XLOG由master提供给几个slave,这些slave消耗事务日志并为您提供一个较好的数据备份.您可能想知道这怎么会导致冲突 ...