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

流程图可以参考下图:在这里插入图片描述
其中:

    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中,实际的渲染工作是在宿主机中执行的。
具体渲染的机制可以参考下图:
在这里插入图片描述

其中:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值