Android Emulator 給用戶提供 GPU on 選項,意思是利用 Host ( 就是執行 Emulator 的PC機) 的 GPU. 固然PC機必須把 OpenGL 的驅動裝好android
在實現上就是把 libGLESv1_CM.so libGLESv2.so 替換掉,當system調用 gl的函數的時候,把調用打包爲stream,並經過 pipe 發送到 host端處理,進入轉化爲對 host opengl的調用。ubuntu
光這樣還不夠,還要把 libegl, libgralloc 都替換了,因爲要調用 host 端的 opengl 必須有 rendercontext, 因此要把 android egl 也轉化爲host 的 xgl的調用(假設你用 ubuntu).函數
建立spa
正常狀況下,當一個apk進程需要建立窗口的時候,它調用egl的函數建立 Surface, 也要調用 gralloc的中函數建立內存來存放Surface需要的光柵 , 然後把 二者關聯,這些都是在本進程中完畢的,但在 Android 3D emulation 的體系結構中,窗口不能直接建立了,而必需經過發命令給 host 端 render 讓它來調用 xgl 的命令來建立遊戲
Surface相應 3D Emulation 中的 WindowSurface, 光柵內存相應 3D Emulation 中的 ColorBuffer.進程
這裏的FrameBuffer 是 3D emulation 中的虛擬 FrameBuffer, 他對 ColorBuffer, WindowSurface, RenderContext進行集中管理ip
更新內存
當APK調用swapBuffers (就是把已經畫的上屏, 這需要各Surface提供圖象內存,有SurfaceFlinger作處理並顯示到屏幕上),可以想象使用opengl的畫圖已經結束,現在就是運行一系列內存 copy, ColorBuffer 把opengl繪好圖的 image 讀取出來.pip
elg的eglMakeCurrent參數提供第一個surface是用來畫東西的,而第二個就是讀取的io
public boolean eglMakeCurrent(EGLDisplay display, EGLSurface draw, EGLSurface read, EGLContext context) ;
應用程序畫東西的時候使用的應該是 EGLSurface draw, 這個 Surface是後臺的,看不見,僅僅是爲了能成功調用opengl的進行硬件渲染
現在上屏了,需要曾經draw的 surface光柵數據讀取回來,固然這是eglMakeCurrent 參數提供的
讀取的Surface光柵內存供SurfaceFlinger操做,最後生成的屏幕圖像在FrameBuffer中,可以直接上屏
最後你在emulator 中,跑賽車遊戲也沒有問題