Android 局部刷新原理

转自:http://www.phpfans.net/article/htmls/201005/Mjg0OTQz.html


需求:

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

Android 2.1架构:

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

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

static char const * constgExtensionString  =

       "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_VSCREENINFOfailed");

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

            return -errno;

        }

实现内容的刷新;

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


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值