zoukankan      html  css  js  c++  java
  • GUI刷新机制研究(四) 脏矩形更新

    前面走到了CoreRoot_UpdateCanvas里面,在此之前已经完成了脏区的计算,下面就是要进行针对脏区的更新了,一起来观观这个是怎么实现的

    一些细节暂时不去深究,抓住主要的地方,可以看到里面是一个for循环,对每个脏区执行一次

    CoreView_Draw, 这里注意不要误入歧途,实际上实现走的是CoreRoot_Draw.

    我们先看一下这个函数的description, 帮助我们搞清楚它要做什么

    好吧,看描述,这个所谓的Canvas的参数,就是最终渲染的结果呈现的地方,aClip是指定一个区域,超过这个区域的内容会被Clip掉。

    在CoreRoot_Draw中, 首先是对当前View的父页面的这个位置进行了一次FillRectangle操作。

    然后就调用CoreGroup_Draw, 在CoreGroup_Draw中,强行把_this转成了(CoreGroup)_this, 这里我们知道CoreGroup是个基类,其它的比如ViewsRectangle和ViewsText 等都是继承自CoreRectView, CoreRectView又是继承自CoreView

    调用了CoreGroup_drawContent, 这里就说的通为啥之前的Calltrace里面会走到这个函数里了

    在这个函数里面,首先一个比较引人注意的操作就是

    CoreView view = _this->first; (也就是说Coregroup中有一个view list, 其first成员指向首个节点)

    然后就是在一个while循环中,完成对viewlist的遍历,我们看下遍历是要做什么

    这里关键的操作是拿着view list中的每个view去测试一下是否和clip区域有交集,如果有,说明,这个view也要更新

    因为是从first开始,所以大胆猜测,first的zorder是最小的,这样就是从下到上依次把所有的view脏掉的部分重新画上

    这里是通过CoreView__Draw(view, ...) 去draw的,还记得一开始也是这个吗,不同的是一开始给的参数是CoreRoot _this

    现在则是各个CoreView子类的自己具体的Draw,

    (CoreView)_this->_VMT->Draw(xxxx)

    这样就最终走到了每个具体的View自己的最终的Draw.

    结合前面第二部分说的渲染部分的实现,这样总算是形成了一个初步的闭环

  • 相关阅读:
    23. call和apply和bind的区别
    22.call方法的深入
    21.函数的三种角色
    20.原型深入
    2.9 原型链综合复习参考
    2.8深入扩展原型链模式常用的六种继承方式
    2.7原型链模式扩展-批量设置公有属性
    php数组函数有哪些操作?php数组函数的应用
    PHP常见的一些问题总结(收藏)
    yii框架 隐藏index.php 以及美化URL(pathinfo模式访问)
  • 原文地址:https://www.cnblogs.com/Arnold-Zhang/p/15345115.html
Copyright © 2011-2022 走看看