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.

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

原文地址:https://www.cnblogs.com/Arnold-Zhang/p/15345115.html