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 架构理解_第1张图片

这里的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 架构理解_第2张图片


最后你在emulator 中,跑赛车游戏也没有问题

Android 3D emulation 架构理解_第3张图片

更多相关文章

  1. Android计算图片占用内存
  2. [Android 性能优化系列]内存之基础篇--Android如何管理内存
  3. Android native内存分配2.0-private dirty memory不回收
  4. Android Vold架构
  5. AAC 系列一】Android 应用架构新时代来临!
  6. Android 进阶 内存泄漏常见案例(续)
  7. Android内存泄漏:谨慎使用getSystemService

随机推荐

  1. android按键静音键功能实现
  2. android 开发之旅
  3. android基本动画,代码构建动画
  4. 安卓开发36:layout对齐属性总结
  5. 高手速成android开源项目【tool篇】
  6. Android原生游戏开发:使用JustWeEngine开
  7. Android之进度条控件和常用资源分类总结
  8. Android画图学习总结(五)——Paint
  9. 一个关于Android视频流的Github项目
  10. Android(安卓)6.0 运行时权限处理完全解