Anbox源码分析(二)——Anbox渲染原理

Anbox源码分析(二)

上一篇,我们大概了解了Anbox的基本架构和安装方法。这篇文章我们来分析下Anbox的视频渲染原理。

Android加载OpenGL ES的流程

在介绍Anbox的视频渲染原理前,我们先要了解Android加载OpenGL ES的流程。

OpenGL ES (OpenGL for Embedded Systems) 是OpenGL的一个子集,可以说是为了嵌入式设备而专门裁剪过的OpenGL。Android中的渲染都是通过OpenGL ES API实现的。
OpenGL ES只是API,或者说只是一个规范,任何人或任何机构都可以根据该规范去实现OpenGL ES的内容。Android允许硬件厂商实现自己的OpenGL ES,并通过一定的方式加载对应的OpenGL ES库。

Android7.1 加载OpenGL ES的源码在/frameworks/native/opengl/libs/EGL/Loader.cpp。

流程图可以参考下图:Anbox源码分析(二)——Anbox渲染原理_第1张图片
其中:

    libEGL_XX.so中的XX可以是硬件厂商自己设定的任何名字
	eglGetProcAddress函数提供OpenGL ES所有函数的地址

Anbox渲染原理

从Android加载OpenGL ES的流程可以看出,只要Anbox在Android的/system/lib64/egl下安装对应的OpenGL ES库,则可以使Android加载Anbox提供的渲染库了。

我们再来看一下Anbox是怎么做的。
anbox/android/opengl/system下有几个文件夹,看一下egl/Android.mk文件。里面可以看到$(call emugl-begin-shared-library,libEGL_emulation),这一行的意思是编译为动态库,库名为libEGL_emulation
OK,与上一节对应上了,顺便提一句,anbox/android文件夹是放在android源码中编译在android镜像中的,编译完成以后,Anbox在Android的/system/lib64/egl下就安装了三个动态库,分别为libEGL_emulation.solibGLESv1_CM_emulation.solibGLESv2_emulation.so。也就是Anbox作为虚拟的硬件厂商给Android提供的OpenGL ES渲染库。

但是,注意了,Anbox实际做渲染工作的并不是这三个库,这三个库的作用只是采集Android中APP渲染的OpenGL ES指令,并把指令通过高速传输通道qemu-pipe传输至宿主机的Anbox中,实际的渲染工作是在宿主机中执行的。
具体渲染的机制可以参考下图:
Anbox源码分析(二)——Anbox渲染原理_第2张图片

其中:

  1. swiftshader是谷歌提供的一种纯软件渲染的方式,代码可以直接在github下载。
  2. 而host是使用宿主机中默认的OpenGL ES库。也就是说,如果宿主机中的显卡及显卡驱动支持OpenGL ES标准规范,则可以直接使用宿主机中的显卡进行渲染。但是目前大部分显卡或驱动都不能直接支持OpenGL ES。

此部分代码在anbox/external/android-emugl/anbox/src/anbox/graphics中。下一篇文章,我们再根据代码具体来介绍Anbox的渲染原理。

你可能感兴趣的:(anbox,android,linux,opengl,3d渲染)