天天看點

Android 3D emulation 架構了解

android emulator 給使用者提供  gpu on 選項,意思是利用 host ( 就是運作 emulator 的pc機) 的 gpu. 當然pc機必須把 opengl 的驅動裝好

在實作上就是把 libglesv1_cm.so  libglesv2.so 替換掉,當system調用 gl的函數的時候,把調用打包為stream,并通過 pipe 發送到 host端處理,進入轉化為對 host opengl的調用。

光這樣還不夠,還要把 libegl, libgralloc 都替換了,因為要調用 host 端的 opengl 必須有 rendercontext, 是以要把 android egl 也轉化為host 的 xgl的調用(如果你用 ubuntu).

建立

正常情況下,當一個apk程序需要建立窗體的時候,它調用egl的函數建立 surface, 也要調用 gralloc的中函數建立記憶體來存放surface需要的光栅 , 而後把 兩者關聯,這些都是在本程序中完成的,但在 android 3d emulation 的體系結構中,窗體不能直接建立了,而必需通過發指令給 host 端 render 讓它來調用 xgl 的指令來建立

surface對應 3d emulation 中的 windowsurface, 光栅記憶體對應 3d emulation 中的 colorbuffer.

Android 3D emulation 架構了解

這裡的framebuffer 是 3d emulation 中的虛拟 framebuffer, 他對 colorbuffer, windowsurface, rendercontext進行集中管理

更新

當apk調用swapbuffers (就是把已經畫的上屏, 這需要各surface提供圖象記憶體,有surfaceflinger做處理并顯示到螢幕上),可以想象使用opengl的繪圖已經結束,現在就是執行一系列記憶體 copy, colorbuffer 把opengl繪好圖的 image 讀取出來.

elg的eglmakecurrent參數提供第一個surface是用來畫東西的,而第二個就是讀取的

public boolean eglmakecurrent(egldisplay display, eglsurface draw, eglsurface read, eglcontext context) ;

應用程式畫東西的時候使用的應該是 eglsurface draw, 這個 surface是背景的,看不見,隻是為了能成功調用opengl的進行硬體渲染

現在上屏了,需要以前draw的 surface光栅資料讀取回來,當然這是eglmakecurrent 參數提供的

讀取的surface光栅記憶體供surfaceflinger操作,最後生成的螢幕圖像在framebuffer中,可以直接上屏

Android 3D emulation 架構了解

最後你在emulator 中,跑賽車遊戲也沒有問題

Android 3D emulation 架構了解