Android 3D emulation 架構理解

來源:互聯網
上載者:User

標籤:android   3d   

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 中,跑賽車遊戲也沒有問題


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.