Android 3D emulation 架构理解
Android Emulator 給用戶提供 ?GPU on 選項,意思是利用 Host ( 就是執(zhí)行 Emulator 的PC機) 的 GPU. 當然PC機必須把 OpenGL 的驅動裝好
在實現(xiàn)上就是把 libGLESv1_CM.so ?libGLESv2.so 替換掉,當system調(diào)用 gl的函數(shù)的時候,把調(diào)用打包為stream,并通過 pipe 發(fā)送到 host端處理,進入轉化為對 host opengl的調(diào)用。
光這樣還不夠,還要把 libegl, libgralloc 都替換了,由于要調(diào)用 host 端的 opengl 必須有 rendercontext, 所以要把 android egl 也轉化為host 的 xgl的調(diào)用(假設你用 ubuntu).
創(chuàng)建
正常情況下,當一個apk進程須要創(chuàng)建窗口的時候,它調(diào)用egl的函數(shù)創(chuàng)建 Surface,?也要調(diào)用 gralloc的中函數(shù)創(chuàng)建內(nèi)存來存放Surface須要的光柵 , 而后把 兩者關聯(lián),這些都是在本進程中完畢的,但在?Android 3D emulation 的體系結構中,窗口不能直接創(chuàng)建了,而必需通過發(fā)命令給 host 端 render 讓它來調(diào)用 xgl 的命令來創(chuàng)建
Surface相應 3D Emulation 中的 WindowSurface,?光柵內(nèi)存相應 3D Emulation 中的 ColorBuffer.
這里的FrameBuffer 是?3D emulation 中的虛擬?FrameBuffer, 他對 ColorBuffer, WindowSurface, RenderContext進行集中管理
更新
當APK調(diào)用swapBuffers (就是把已經(jīng)畫的上屏, 這須要各Surface提供圖象內(nèi)存,有SurfaceFlinger做處理并顯示到屏幕上),能夠想象使用opengl的畫圖已經(jīng)結束,如今就是運行一系列內(nèi)存 copy, ColorBuffer 把opengl繪好圖的 image 讀取出來.
elg的eglMakeCurrent參數(shù)提供第一個surface是用來畫東西的,而第二個就是讀取的
public boolean eglMakeCurrent(EGLDisplay display, EGLSurface draw, EGLSurface read, EGLContext context) ;
應用程序畫東西的時候使用的應該是?EGLSurface draw, 這個 Surface是后臺的,看不見,僅僅是為了能成功調(diào)用opengl的進行硬件渲染
如今上屏了,須要曾經(jīng)draw的 surface光柵數(shù)據(jù)讀取回來,當然這是eglMakeCurrent 參數(shù)提供的
讀取的Surface光柵內(nèi)存供SurfaceFlinger操作,最后生成的屏幕圖像在FrameBuffer中,能夠直接上屏
最后你在emulator 中,跑賽車游戲也沒有問題
轉載于:https://www.cnblogs.com/mengfanrong/p/3774689.html
總結
以上是生活随笔為你收集整理的Android 3D emulation 架构理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 产品经理的几个阶段
- 下一篇: Linux系统中的load averag