Tiled Backing Store (二)

2.2 前缓冲区(Front buffer)

       通过Qt的画笔绘制瓦片(tile)实际上就是要绘制存储在瓦片前缓冲区里的pixmap位图。没有前缓冲区的瓦片意味着它不需要绘制。

2.3 后缓冲区(Backend Buffer)

       后缓冲区充当瓦片的屏幕外(off-screen)缓冲区,可以使用Qt的画笔把它绘制到Qt widget上。在更新后缓冲区的过程中,对于使无效操作(invalidate)引起的脏区域,WebKit把这些脏区域的内容绘制到这个后缓冲区;因为有缩放需求,绘制使用的画笔或许伴随比例缩放等几何变换。

      WebCore::FrameView通过调用paintContents来更新脏区域 。一旦后缓冲区更新完毕,它就会被函数swapBackBufferToFron交换到前面去,从而瓦片(的新内容)可以绘制到Qt widget上。

2.4 分片后端存储区(TiledBackingStore)的职责

     分片后端存储区的职责就是管理所有的瓦片(tile),功能包括:

  • 定义分片策略(Tiling Policy):包括瓦片的大小,覆盖区域因子,创建延迟时间,内容缩放因子。
  • 创建瓦片:使用定时器来触发创建瓦片的操作。定时器也可以通过函数TiledBackingStore::startTileCreationTimer触发,一旦时间到,createTiles会执行。 当分片后端存储区尝试调整可见区域时,瓦片的创建会被安排在区域调整之后执行。
  • 更新瓦片缓冲区: 类似于瓦片的创建,更新操作也是通过定时器实现的。当一块内容区变脏了,分片后端存储区首先计算哪些瓦片与脏区域有交集,随后安排更新任务。
  • 冻结状态(Frozen State): 分片后端存储区在冻结状态没什么要做的。例如,它既不会更新(瓦片的)后缓冲区,也不会创建瓦片。冻结状态的引入主要是避免某些例如内容缩放的场合下,分片后端存储区进行耗时长的操作。一旦通过函数setContentsFrozen(false)推出冻结状态,  分片后端存储区就会检查以前设置的缩放因子,如果不是0,分片后端存储区不得不按照缩放因子更新瓦片的后缓冲区。

2.5 分片后端存储区客户端(TiledBackingStoreClient)

       所有与渲染相关的功能都抽象到了此类,它是一个接口, WebCore::Frame是它的实例,它负责:
  • tiledBackingStorePaintBegin:更新分片后端存储区开始之前必须做完的事情。渲染引擎应确保此时绘制到分片后端存储区的屏幕外缓冲区的内容是正确的,因此引擎不得不清楚所有延迟的重绘操作。
  • tiledBackingStorePaint: 渲染引擎通过调用WebCore::FrameView::paintContents绘制内容到分片后端存储区的屏幕外缓冲区.
  • tiledBackingStorePaintEnd: 更新分片后端存储区完成之后必须做完的事情. 一旦分片后端存储区屏幕外缓冲区更新之后,问题自然来了:''UI前端是如何立即知道发生了更新并且安排一次对widget的重绘、以便把内容绘制到widget上?Download
          答案就是,在分片后端存储区更新结束,分片后端存储区会调用invalidateContentsAndWindow函数来通知
    WebCore::ChromeClient (ChromeClientQt for WebKit port) 使内容无效。 在QtWebKit里, invalidateContentsAndWindow最终会通过PageClientQGraphicsWidget安排一次QGraphicsWebView的绘制事件。
  • tiledBackingStoreContentsRect:返回网页frame的内容大小。
  • tiledBackingStoreVisibleRect:返回用于绘制网页的图形之可见区,实际上就是QGraphicsWebView的可见区。
  • 原文:http://xbfp2b2n.blog.sohu.com/196617339.html

你可能感兴趣的:(Tiled Backing Store (二))