編輯:Android開發教程
1.1.1 應用程序與BufferQueue的關系
接著上一小節未解決完的問題繼續講解。
現在我們已經明白了應用程序利用SurfaceFlinger進行繪制工作的大致流程了,只不過在這個過程中直到最後才出現了BufferQueue。應用程序具體是如何借助BufferQueue來完成工作的呢?
仔細觀察不難發現,當應用端通過ISurfaceComposerClient::createSurface()來發起創建Surface的請求時,SurfaceFlinger服務進程這邊會創建一個Layer。既然Layer代表了一個畫面圖層,那麼它肯定需要有存儲圖層數據的地方,因而我們選擇從這裡做為入口。
/*frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp*/
/*應用程序首先是要通過ISurfaceComposerClient來訪問createSurface,這個接口實際上只是一個中介,它將應用的請求傳送到SurfaceFlinger的消息隊列中,而不是直接調用SurfaceFlinger來處理。這樣做是有必要的,因為一個系統中需要SurfaceFlinger處理的來自各應用程序的消息是很多的,除非一些緊急情況,否則都應該排隊等待*/
sp<ISurface>SurfaceFlinger::createSurface(ISurfaceComposerClient::surface_data_t* params,
constString8& name, const sp<Client>& client, DisplayID d,
uint32_tw, uint32_t h, PixelFormat format, uint32_t flags)
{
sp<LayerBaseClient>layer;
sp<ISurface>surfaceHandle;
…
sp<Layer>normalLayer;
switch (flags &eFXSurfaceMask) { //Layer類型
case eFXSurfaceNormal:
normalLayer = createNormalSurface(client, d, w, h, flags, format);
layer =normalLayer;
break;
case eFXSurfaceBlur://4.1系統中將Blur與Dim類型當成一種
case eFXSurfaceDim:
layer = createDimSurface(client, d, w, h, flags);
break;
case eFXSurfaceScreenshot:
layer = createScreenshotSurface(client, d, w, h, flags);
break;
}
if (layer != 0) {…
surfaceHandle = layer->getSurface();
…
}
return surfaceHandle;
}
博主思來想去,覺得還是想把這個教程寫的再細一點,讓讀者能夠更清楚的了解LibGDX這個游戲引擎整體 的架構,所以也就總結出了這樣一篇文章。一、模塊概述作為游戲開發人員,我
前言:學習Android也有一年多了,目前在從事Android開發的工作。不敢說精通,但也小有心得 。相信很多android初學者和我剛開始接觸android時一樣,往往
新的系統保留了原來Jelly Bean 名字,整體用戶體驗並沒有太大的改動,不過一些新的功能還是值得大家關注的。Google Now 更新在新的Google Now 中,
如果@Provides方法很復雜的話,可以將這些代碼移動到單獨的類中。這個類 需要實現Guice的Provider 接口,該接口定義如下public interface