QEMU KVM 虚拟机移植之性能提高篇小结(android 虚拟机双系统方案)

一、提升性能核心要素 

 

1、将OPENGL 接口进行穿透调用,下面对opengl穿透做个小结

2、在arm开发板上打开kvm特性,这个qcom&mtk都是实现了的,只需要打开开关即可

 

二、ANDROID OPENGL 业务实现细节解释

 

1、  OPENGL命令队列是确定了,可是命令的参数,有的是系统给的,有的是上一个命令计算的结果,例如纹理操作,首先调用API创建一个纹理,得到纹理标记,然后后面再使用API操作该纹理时,就是使用这个纹理标记的。因此如果遇到这个创建纹理的API,则要把以前积累的API队列传到host端,依次执行,最后得到这个API的结果,然后回传,这个过程是循环执行,直到遇到最终API后,把剩余的API队列传到HOST端,这一帧才算完。

2、  OPENGL命令队列有时候根据一个API的结果会有变化的,APP的四个绘制过程只是把系统给的参数计算完,如果遇到需要API计算参数的,同样会先把积压的API计算完,然后根据结果选择分支路径。所以ANDROID系统的那四个过程并不是完全独立的,它们之间有一些重叠。最好的APP,就要把这种重叠降低到最少。APP想要运行效率高,就是要非常利索的一次生成命令队列,减少打断。

 

三、opengl 远程调用技术小结。

A:业务层面

1、  本来是一帧的命令队列一次性传递,但由于有打断,所以实际情况是一帧的命令队列分批传递。

2、  一些特殊的API耗时比较严重;一些接口并不需要回传参数;一些接口是远程调用特有的,例如合成过程都综合在一个远程“接口”中,后端一遇到这种标记就知道要合成了。

3、  一些特殊的API会由于业务约束被分解为数个API进行远程调用,这个情况会在opengl 1.0中非常常见,后续的版本则会少一些。

4、  API1.0 = 271 API2.0=208 EGLAPI=43 远程调用API=25 总共547个接口,只熟悉其中核心的43+25+50+50?来个接口,生僻或者看名字就知道干啥的就没有细细研究。

 

B:技术层面

1、  每个API中通过包装API标记、参数,得到字节序列,写入PIPE驱动。

2、  由于VM内存页分配不是连续的,PIPE驱动会把远程数据地址分几次传递给QEMU

3、  QEMU得到地址后,经过地址转换,获得远程数据,也是分批写入socket的。

4、  OPENGL THREAD也会分几次接收到远程数据,解析得到API标记和参数。

5、  依次根据API标记调用API

6、  得到结果后由OPENGL THREAD写入socket

7、  QEMUsocket得到结果,经过地址转换,将数值写入相关内存区域。

8、  VMPIPE驱动得到结果后,一次远程调用结束。(其中VMPIPE驱动和OPENGL THREAD 执行是并行运行的)

 

C:性能层面

1、  普通应用一帧的耗时在10-30毫秒,特殊应用一帧的耗时就非常差了。

2、  一次远程调用的耗时在3571.9微秒,去掉OPENGL API执行时间耗时在2367.8微秒。

 

D:优化层面

1、  业务方面:检查每个API是否有无效操作,去掉无效操作,应该能大幅提升性能。

2、  技术方面:去掉socket技术,去掉一个进程,将OPENGL THREAD合进QEMU,应该能较小的提升性能。

 

QEMU KVM 虚拟机移植之性能提高篇小结(android 虚拟机双系统方案)_第1张图片

 

QEMU KVM 虚拟机移植之性能提高篇小结(android 虚拟机双系统方案)_第2张图片

 

*我的github有源码,2016年初完成的,贡献给社区,性能比Android真机差一点,15MS左右的延迟

 

很多朋友私信问性能怎么样

1、操作桌面、一般的app都是比较流畅的

2、操作复杂的游戏APP比较卡,会出现丢帧现象

3、使用gfxinfo工具检测性能,会看见15~20MS的延迟每一帧

 

很多朋友私信问有没有完成过程

1、需要实体机的代码,调通kvm特性

2、下载google android源码,最好是android 5.0 ,因为我只在那上面试过,这份代码是vm android,内核使用goldfish版本

3、将qemu交叉编译到实体机上,尝试跑通android 虚拟机,这个过程有很多BUG要解,耐心点,最好使用我提供的qemu版本,我在那上面解过BUG,且我的qemu是从标准qemu分支拉出来的,最重要的我这个qemu能穿透opengl接口,有GPU虚拟化方案和input虚拟化办法,并没有使用android模拟器的qemu,你们可以试一试android的qemu

4、将我提供的OpenglRender编出来,运行在实体机中,它通过socket与qemu通信,执行一系列的opengl操作,并将虚拟机显示在一张surface中,最终虚拟机界面会出现在实体机中

5、对android比较熟悉的人,会很快实现的,当时我实现这个的时候对android一窍不通,一步一步的摸索

6、android虚拟机双系统论文地址http://systems.cs.columbia.edu/projects/kvm-arm/

   各种设备虚拟化理论http://www.virtualopensystems.com/

你可能感兴趣的:(Android)