我们来看apk中开启硬件加速后,硬件渲染的第三部分:
将保存有webkit绘制命令的SKPicture集合显示到framebuffer上
是怎样具体实现的。
下面的图是webkit 硬件渲染过程涉及的主要类的类图。
下图是硬件渲染过程中paint的详细顺序图。
也是从webview.java::onDraw()开始,调用webview.java drawContent(),drawContent()接着调用drawCoreAndCursorRing().
drawCoreAndCursorRing()中调用nativeGetDrawGLFunction得到WebView.cpp中drawGL()的函数对象GLDrawFunctor的实例指针。
drawCoreAndrCursorRing()中接着调用((HardwareCanvas) canvas).callDrawGLFunction(functor).这个函数的作用就是使GLDrawFunctor指向的函数得到调用。
所以WebView.cpp中的drawGL()开始执行。
WebView.cpp的drawGL()第一次执行时候会创建GLWebViewState,并调用GLWebViewState的m_glWebViewState->setBaseLayer()。将含有网页绘制命令的BaseLayerAndroid实例指针传给GLWebViewState.
GLWebViewState的drawGL()先通过TilesManager调用TransferQueue的updateDirtyBaseTiles().这个过程我们稍候分析。
接着调用TilesManager的gatherLayerTextures()把当前可用的BaseTileTexture加锁。
接着调用setupDrawing()为即将开始的drawGL()作准备。
这些准备工作包括:
1.为TilesManger的ShaderProgram设置所需信息;
2.调用setViewport()计算水平和垂直方向所需要的BaseTile数,并调用TilesManager的setMaxTextureCount()分配所需的BaseTileTexture.分配好的B