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.
這里的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中,能夠直接上屏
最后你在emulator 中,跑賽車游戲也沒有問題
轉載于:https://www.cnblogs.com/mengfanrong/p/3774689.html
總結
以上是生活随笔為你收集整理的Android 3D emulation 架构理解的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 产品经理的几个阶段
 - 下一篇: Linux系统中的load averag