編輯:Android開發實例
SurfaceFlinger繼承了Thread類,自然也繼承了Thread類的threadLoop方法,SurfaceFlinger工作線程的主代碼都在threadLoop()方法中。工作線程啟動後,基類Thread會循環地調用threadLoop方法,SurfaceFlinger的threadLoop()主要是要完成系統中各個Layer(Surface)進行混合(compose),然後不停地把一幀幀混合好的圖像數據傳送到顯示設備中。
圖一 threadLoop流程
handleConsoleEvent目前沒有深入了解,貌似只是處理顯示設備進入休眠狀態或者從休眠中喚醒時,改變SufaceFlinger的狀態,然後threadLoop的後續流程會根據相應的狀態來決定是否繼續給顯示設備傳送顯示數據。
因為Layer的混合是在線程中進行的,而混合的過程中,應用程序或者系統可能會改變Layer的狀態,例如屏幕旋轉、增加或刪除Layer、某個Layer可見或不可見,為了使這些變動不會破壞當前正在進行的混合動作,SurfaceFlinger維護著兩個Layer列表:
handleTransaction就是根據Layer列表的這些狀態的變化,計算是否有可見區域內需要更新,並設置狀態變量mVisibleRegionsDirty,然後把mCurrentState賦值給mDrawingState,最後釋放已經被丟棄(ditch)的Layer
該階段會遍歷各個Layer,在每個Layer中,取得並鎖住該Layer的frontBuffer,然後利用frontBuffer中的圖像數據生成該Layer的2D貼圖(Texture),並且計算更新區域,為後續的混合操作做准備。
圖二 handlePageFlip處理流程
Layer的lockPageFlip()首先通過SharedBufferServer類的成員變量lcblk,調用retireAndLock取得該Layer當前可用的frontBuffer,然後通過reloadTexture方法生成openGL ES的紋理貼圖,最後通過unlockPageFlip完成更新區域的Layer坐標到屏幕坐標的變換。
handleRepaint真正實現Layer混合的階段,下圖是handleRepaint的處理流程:
圖三 handleRepaint 的處理流程
handleRepaint首先重置了openGL的觀察矩陣,然後遍歷mDrawingState.layersSortedByZ 中的Layer列表,調用每個Layer的onDraw方法,在onDraw方法中,會調用drawWithOpenGL()方法,將在handlePageFlip階段生成的貼圖混合到OpenGL的主表面,最後handleRepaint把需要刷新的區域清除。
unlockClients只是遍歷各個Layer並調用各個Layer的finishPageFlip方法。finishPageFlip會進一步調用SharedBufferServer的unlock()方法:(關於SharedBufferSever,請參考本人以下博文的SharedClient 和 SharedBufferStack一節)
- void Layer::finishPageFlip()
- {
- status_t err = lcblk->unlock( mFrontBufferIndex );
- LOGE_IF(err!=NO_ERROR,
- "layer %p, buffer=%d wasn't locked!",
- this, mFrontBufferIndex);
- }
lcblk->unlock( mFrontBufferIndex )會把Layer的frontBuffer解除鎖定。
進入postFramebuffer階段,OpenGL主表面已經准備好了混合完成的圖像數據,postFramebuffer只是簡單地調用hw.flip(),hw.flip()進一步調用了eglSwapBuffers完成主表面的切換,這樣屏幕上的圖像就會更新為新的數據。
Fragment Android是在Android 3.0 (API level 11)開始引入Fragment的。 可以把Fragment想成Activity中
本文實例講述了Android編程實現自定義進度條顏色的方法。分享給大家供大家參考,具體如下: android 自定義進度條顏色 先看圖 基於產品經理各種自定義需
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我