需求:

有的 LCD 是支持局部刷新的,所谓局部刷新也就是说,如果 UI 层有更新,驱动才会去刷新 framebuffer 的区域,并且只需要刷新这块脏的区域,这需要 LCD 本身有一个缓存,能够保持 framebuffer 上一帧的数据;

Android 2.1 架构:

Android 本身是提供了这个局部刷新的支持的,不过默认并没有启用,如图所示:

这个 init 在执行的时候首先会查询opengl所支持的扩展,看是否支持 EGL_ANDROID_swap_rectangle 的扩展,默认的 opengl 的实现里面是包含以下扩展的:

static char const * const gExtensionString  =

"EGL_KHR_image "

"EGL_KHR_image_base "

"EGL_KHR_image_pixmap "

"EGL_ANDROID_image_native_buffer "

"EGL_ANDROID_swap_rectangle "

"EGL_ANDROID_get_render_buffer "

所以有了代码 mFlags |= SWAP_RECTANGLE,

这个 flag 的意思就是在刷新的时候需要把旧的脏区域减去新的脏区域,然后通过交换缓冲实现刷新数据,默认的代码都应该是走的这条路线;

后来的逻辑就是:

if (mNativeWindow->isUpdateOnDemand() ) {

mFlags |= PARTIAL_UPDATES ;

}

这里如果 if 为真,就会把 PARTIAL_UPDATES 的 flag 置上,并且还有这样的逻辑:

if (mFlags & PARTIAL_UPDATES)

mFlags &= ~SWAP_RECTANGLE ;

也就是说如果有了 PARTIAL_UPDATES 的标志,那么会把 SWAP_RECTANGLE 标志给清掉;

好,现在回头看看这个 mNativeWindow->isUpdateOnDemand() 的逻辑,如图所示:

总结一下这个图的意思就是说:如果从驱动读上来的 finfo 里面的 reserved 数组满足上面的条件(当然这个条件由驱动来决定),那么就会调用:

dev->device.setUpdateRect = fb_setUpdateRect;

而赋上了这个值后, mUpdateOnDemand 就会被设为真,于是在 init 函数里面就会设上 PARTIAL_UPDATES 的标志,于是 android 的架构就开始支持局部刷新了,下面看看,这个局部刷新到底意味着什么 ?

局部刷新的体现 :

如下图所示:

这里会调用到 framebuffer.cpp 里面的 fb_setUpdateRect 函数,而在这里面需要做的事情就是告诉驱动,你需要更新的区域,于是在 egl.cpp 里面的 swapBuffers 函数调用的时候会触发 framebuffer.cpp 里面的 fb_post 函数调用,在那里通过:

m->base.lock(&m->base, buffer,

private_module_t::PRIV_USAGE_LOCKED_FOR_POST,

0, 0, m->info.xres, m->info.yres, NULL);

const size_t offset = hnd->base - m->framebuffer->base;

m->info.activate = FB_ACTIVATE_VBL;

m->info.yoffset = offset / m->finfo.line_length;

if (ioctl(m->framebuffer->fd, FBIOPUT_VSCREENINFO, &m->info) == -1) {

LOGE("FBIOPUT_VSCREENINFO failed");

m->base.unlock(&m->base, buffer);

return -errno;

}

实现内容的刷新;

当然前提是驱动已经做好了这个准备;

Android 局部刷新相关推荐

  1. android ListView 局部刷新

    今天,简单讲讲android如何对ListView 进行局部刷新. 之前,自己做的ListView 发现刷新频率太高了,而且很多界面上看不到的数据改变时调用Adapter.notifyDataSetC ...

  2. android:ListView的局部刷新

    1.简介 对于android中的ListView刷新机制,大多数的程序员都是很熟悉的,修改或者添加adapter中的数据源之后,然后调用notifyDataSetChanged()刷新ListView ...

  3. Android ListView优化之局部刷新(更新)(非notifyDataSetChanged)

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53020164 [DylanAndroid的csdn博客] 在Android开发 ...

  4. android局部布局刷新,Android RecyclerView 局部刷新分析

    前情回顾 之前写的 PowerAdapter 和 SelectPowerAdapter 从创建到现在,已经两年多,期间发生了翻天覆地的变化.一开始,我把 SwipeRefreshLayout 和 Re ...

  5. android 自定义view局部刷新,Android 优化之局部刷新

    RecyclerView 局部刷新 相信现在已经很少人不用 RecyclerView 了,如果只有一个 item 的数据源改变的时候,大家都会用 notifyItemChanged(int posit ...

  6. android局部布局刷新,Android之RecyclerView的局部刷新

    局部更新方法 1.使用Diffutil进行数据的比较 [Android]详解7.0带来的新工具类:DiffUtil 1.1一个相对完整的例子 Android高性能列表:RecyclerView + D ...

  7. android局部动态刷新,RecyclerView的局部刷新爬坑之路简述

    RecyclerView的局部刷新爬坑之路简述,实际上RecyclerView做局部刷新是非常容易的,其实就是使用好带payload参数的这个notifyItemRangeChanged方法,以及ov ...

  8. 解决RecycleView局部刷新iteam时, EditText抢占焦点问题

    最近在一个模版选择的功能,当选择否的时候,会填写问题照片和问题描述,在进行操作的时候遇到了一个问题,就是RecycleView局部刷新iteam时, EditText抢占焦点问题,问题如下: 解决了好 ...

  9. RecyclerView局部刷新和原理介绍

    RecyclerView局部刷新和原理介绍 一.引言 二.局部刷新的正确使用姿势 三.局部刷新的原理 3.0 前提 3.1 RecyclerView与Adapter建立观察者模式 3.2 onItem ...

最新文章

  1. hdu4888 最大流(构造矩阵)
  2. 大数据与智能算法(三-集疏运应用)-SMU在线学习笔记
  3. 编译原理:用lex/flex做词法分析
  4. 货物贸易外汇监测系统 企业版_企业能耗在线监测系统介绍
  5. Lingo解决最优化问题
  6. QQ群会员彩色昵称代码
  7. FinePrint双面打印设置
  8. C语言:cJSON库用法详解
  9. 各大IT公司、软件公司员工等级(级别)及薪资
  10. Discuz X3.4模板创建与配置原理简介
  11. 微信公众平台入门到精通-新浪云计算平台注册和使用
  12. 利用计算图计算公积金余额
  13. iOS小技能:iOS15崩溃排查技巧(symbolicatecrash符号化分析问题、导出和隐藏符号)
  14. SQL常用的一些关键字
  15. 『递推』[AGC043D] Merge Triplets
  16. Spring boot Failed to bind properties under ‘XXX‘问题
  17. 丘成桐科学奖计算机类,丘成桐科学奖
  18. 祁文之恋——婚纱照——准备
  19. Cascader 级联选择器如何根据给定的叶节点值设置默认值(数据回显)
  20. 夯实基础,Java8新特性Stream详细教程

热门文章

  1. PHP 中 GD库(以及Jpgraph库) 的配置和使用。(满屏荒唐言,一把辛酸泪)
  2. 谷歌浏览器设置默认搜索引擎
  3. 小程序基本标签与语法
  4. 查找和排序方法归类----C和C++
  5. 18650圆柱锂电池comsol5.6模型 参数已配置,电化学生热研究,三种放电倍率
  6. 建模学习—带你轻松认识并掌握3Dmax
  7. JAVA专业课题研究方向有哪些,课题研究方向有哪些
  8. 港科夜闻|「广州粤港澳大湾区研究院」成立,香港科技大学校长史维教授获聘担任研究院顾问...
  9. 互联网券商线上开户系统设计与开发技术分享
  10. OSPF之链路状态数据库LSDB