android4.0.1 webkit 硬件渲染用到的GL架构

来自GLWebViewState.h中的一段注释,这段注释详细说明了webkit 硬件渲染的架构。

GL 架构
在绘制时,WebView也用到了一棵Layer 树,这棵树的根节点是BaseLayerAndroid,在它之上可能有许多LayerAndroid.
LayerAndroid的内容是SKPicture,BaseLayer的内容是PictureSet.
在绘制的时候,我们有一个大的surface,这个surface就是BaseLayer.
还有另外一些surface(通常比较小),这些surface是LayerAndroid.
BaseLayer 代表网页的常规内容,Layers 用来代表一些特殊的元素,
比如特殊的divs(e.g. fixed position divs, or elements using CSS3D transforms, or containing video,
plugins, etc).
注意:GL绘制架构目前只绘制BaseLayer.
渲染模型利用tiles 来显示BaseLayer的内容(很明显BaseLayer的区域可以任意大)。
基本思想是计算一组可以覆盖viewport的titles。
然后利用Webview的内容(BaseLayer的PictureSet)绘制这些tiles.
对每个frame,我们检测需要用到的tile.
Overview
---------
tiles被组合在TiledPage中。
基本上一组tiles覆盖BaseLayer的surfaece.
当绘制时,我们调用TilePage的prepare()函数,然后在屏幕上绘制它本身。
prepare()函数用来协调将被绘制的titles。
比如与当前ViewPort有交集的tiles子集.
当这些titles准备好后,我们将显示这个TiledPage.
如果需要重新调用(比如需要更新texture或者正在进行变换),BaseLayerAndroid::drawGL() 会返回true给java层。
Tiles的具体实现类是BaseTile. BaseTile知道如何利用PictureSet绘制并且显示自己。
通常每个BaseTile都有一个GL texture 关联着。
我们也用双TiledPage方式工作。一个用来显示当前缩放因子下的页面,一个用来绘制具有不同缩放因子的页面。
比如,当我们缩放时,用具有相应缩放比例的tiles(所以可能会有失真),
这个操作是纯硬件操作所以很快。
当用户做完缩放动作时,我们使TiledPage B 在新的缩放因子的条件下被绘制,覆盖viewport 区域。
当B 准备好后,我们用B 替换A。
纹理申请(Texture allocation)
------------------
很明显,我们不能使每个BaseTile 都拥有一个GL texture.我们需要从一个已存的池中获得GL textures.
并且重用它们。
我们实现这种方式的方法是:
当我们调用TilePage::prepare()时,将我们需要的tiles(比如,viewport 和 失效区域)都放入一个TilesSet然后对每个Tile调用BaseTile::reserveTexture()。
(这样可以确保每个BaseTiles后面都有一个GL textures).
reserveTexture()会请求TilesManager 得到一个texture.
分配机制的目的是:
优先分配与上次相同的texture.
优先分配与viewport相隔尽可能远的textures.
优先分配不同TiledPage使用的textures.
BaseTile失效(BaseTile Invalidation)
------------------
当一个tile 在更新时,我们并不想重新绘制它。
一个tile 只有在如下情况下才被认为是脏的需要重绘:
tile 申请了一个新的texture;
webkit使tiles的部分或全部内容失效;
为了处理 webit失效,我们在一个tile中存储pictureSet的两个id.
第一个id(A)表示用来绘制tile的pictureset;第二个id(B)
用来表示webkit使其失效的tile所在的pictureset.
所以, 如果 A < B tile 就是脏的。
由于失效比整个tiled page 更新发生的快。
tiled page 被设置为true的锁保护着用来延迟background layer的更新,
给 foreground 时间来渲染 内容 而不是一直的失效刷新。
见 lockBaseLayerUpdate() & unlockBaseLayerUpdate().
(调度绘制)Painting scheduling
-------------------
下一个操作是调度TileSet使其被绘制。
(TilesManager::schedulePaintForTilesSet()).
TexturesGenerator用来得到TileSet 并使TileSet中的BaseTiles被绘制。
BaseTile::paintBitmap()会使用BaseLayer的PictureSet来绘制texture.
(调用 TiledPage::paintBaseLayerContent(),这个函数接着调用
GLWebViewState::paintBaseLayerContent()).
需要注意TexturesGenerator运行在单独的线程中.
textures使用EGLImage共享,(为了不减慢渲染速度这是必要的--在主GL 线程中更新GL texture会减慢渲染速度。)
 


你可能感兴趣的:(android4.0.1 webkit 硬件渲染用到的GL架构)