网上关于android,fence的资料好少啊,几乎没有,但是这个机制又在GUI系统中起着重要的作用,于是自己通读源码和注释,与大家分享下Fence到底是怎么回事?

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

本篇主要讲述fencesurfaceflinger中的应用的理论基础,确切的说fenceproducerconsumerbuffer处理的过程中是如何协调他们同步的工作,从而保证buffer内容的准确性,而不会被篡改。

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

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

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

DEQUEUED是指producer已经申请了一个buffer从队列中出来了,还没有入队列或者取消buffer,这个状态下的bufferproducer想对其进行修改也就是填入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就会发一个信号。当一个bufferfree的时候,消费者已经完成了从buffer里读出来东西或者如果它在queuebuffer一些操作之后调用了cancelBuffer当生产者完成了对buffer的写操作。如果当buffer处于QUEUED状态时,这表明了生产者完成了对buffer的填充。当buffer处于DEQUEUEACQUIRED状态时,fence已经被传给了消费者或者生产者连同buffer的所属者,这个时候fence被置为NO_FENCE.

更多相关文章

  1. Android中为什么主线程更新UI,子线程执行耗时操作?
  2. Android(安卓)UI设计(转)
  3. 深入探索编译插桩技术(四、ASM 探秘)
  4. Android必学之AsyncTask
  5. Android单点触控技术,对图片进行平移,缩放,旋转操作
  6. Android(安卓)RxJava:这是一份全面 & 详细 的RxJava操作符 使用攻
  7. 【Android】SQLiteOpenHelper类(sql语句实现增删改查),封装SQLite
  8. 浅看Android与IOS
  9. (Android) 如何使用HOOK实现动态注入以及自动化操作

随机推荐

  1. android studio更改module名字
  2. Android实现简单短信发送器
  3. AndroidX迁移——弃用support库指南
  4. android 图片设置圆角
  5. Android之fragment的两种创建方式
  6. 【黑马Android】(02)短信发送器/布局演示
  7. Android原生应用的CTS测试步骤
  8. Android RecyclerView添加分隔线 Divider
  9. Android SDK Android NDK 官方下载地址
  10. Android Timer编写方式