網頁的顯示主要分成WebCore渲染,OpenGl紋理渲染(GPU),系統將OpenGl紋理顯示於螢幕上 這三個步驟。 其中第一步是解析網頁最後形成一個PictureSet。第二步是產生每個tile的SkBitmap,並據此由GPU形成OpenGl紋理。最後一步根據OpenGl紋理顯示內容在螢幕上。androidBrowser硬體加速的代碼改動非常大,這裡針對的是4.0的代碼。 本文主要關注每個tile由SkBitmap轉換為OpenGl紋理的過程。本過程是由TransferQueue::tryUpdateQueueWithBitmap函數開始,而在TransferQueue::updateDirtyBaseTiles函數結束。其中前者運行於TexturesGenerator線程,由BaseTile::paintBitmap函數調用而來。而後者運行於UI線程,在每次GLWebViewState::drawGL的時候都會調用,以更新各個tile的紋理。 紋理的渲染過程是由系統來完成的,類TransferQueue管理各個tile的渲染順序並與系統互動。其中有一個SurfaceTexture對象和一個SurfaceTextureClient對象。這兩個對象是android系統中專門用於GPU渲染紋理的,SurfaceTexture相當於服務端而SurfaceTextureClient為用戶端,它們共用一塊顯存數組。SurfaceTexture中還有一個待渲染的顯存隊列(由上述數組的下標組成)。真正的渲染髮生在SurfaceTexture::updateTexImage函數。而SurfaceTexture中有諸如dequeueBuffer和queueBuffer之類的函數,用來管理顯存數組和隊列。 TransferQueue::tryUpdateQueueWithBitmap函數中通過ANativeWindow_lock函數最終會調用到SurfaceTexture::dequeueBuffer,取得一塊空閑顯存。然後將SkBitmap的資料以記憶體拷貝的方式複製過去。然後ANativeWindow_unlockAndPost最終調用到SurfaceTexture::queueBuffer函數,將已有內容的顯存放到待渲染隊列中。 TransferQueue::updateDirtyBaseTiles則調用SurfaceTexture::updateTexImage函數依次從隊列中取出顯存並渲染紋理。每次渲染一個紋理都通過幀緩衝和顯存拷貝的方式(TransferQueue::blitTileFromQueue)複製給每個相應的tile。 這樣,整個過程就結束了。