Android 4.0 硬體加速紋理渲染過程

來源:互聯網
上載者:User

網頁的顯示主要分成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。     這樣,整個過程就結束了。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.