需求:

有的 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;

}

实现内容的刷新;

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

更多相关文章

  1. [置顶] 《老罗的Android之旅》导读PPT
  2. android视图学习---Android深入浅出之Surface[1]
  3. android,饼图,扇形图,点击,转动,随手记,可以转动的绚烂饼图
  4. mmap那些事之android property实现之二
  5. Android逆向之旅—Hook神器Cydia Substrate使用详解
  6. 《老罗的Android之旅》导读PPT
  7. Android(安卓)Binder框架实现之Framework层服务注册过程源码分析
  8. 锦囊篇|一文摸懂ButterKnife
  9. Android扩大控件的点击区域

随机推荐

  1. android 某些三星手机上不显示通知Notifi
  2. Android(安卓)Apk瘦身指南大全
  3. Android通讯录管理(获取联系人、通话记录
  4. Android同一图片在不同分辨率下长宽不同
  5. android打开一个activity时,什么情况使用f
  6. 关于android混合开发模式Hybrid逻辑梳理
  7. 人人都是 Android(安卓)开发者 - Android
  8. android修改按键的映射
  9. 从破解APP开始学Android——用户登录验证
  10. Android(安卓)创建与解析XML(二)---- DOM方