关于openGL, openGL ES, openVG及android中2D调用关系的报告
报告分为两大部分,第一部分是3.22号在中心五楼会议室讨论后的一些需要深入调研的点,第二部分是android对2D的调用关系。
第一部分:
OpenGL(全写OpenGraphicsLibrary)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于生成二维、三维图像。这个接口由近三百五十个不同的函数调用组成,用来从简单的图元绘制复杂的三维景象。主要用于pc和工作站。
OpenVG是针对诸如Flash和SVG的矢量图形算法库提供底层硬件加速界面的免授权费、跨平台应用程序接口API。也是由OpenGL的拥有者khronos公司提出的。OpenVG现仍处于发展阶段,其初始目标主要面向需要高质量矢量图形算法加速技术的便携手持设备,用以在小屏幕设备上实现动人心弦的用户界面和文本显示效果,并支持硬件加速以在极低的处理器功率级别下实现流畅的交互性能。
但是android中2D向量图形函数库并没有使用OpenVG,而是使用了Google在05年收购的一家公司提供的引擎叫skia。它可以搭配OpenGL/ES与特定的硬体特征,强化显示的效果。综上,2D图形硬件无需支持OpenVG。
OpenGLES(OpenGLforEmbeddedSystems)是一个针对嵌入式应用的,免费的,支持全功能2D、3D的跨平台API(OpenGL®ESisaroyalty-free,cross-platformAPIforfull-function2Dand3Dgraphicsonembeddedsystems-includingconsoles,phones,appliancesandvehicles)。目前主要由3个版本,1.0,1.1,2.0.
OpenGLES1.0是以OpenGL1.3规范为基础的,OpenGLES1.1是以OpenGL1.5规范为基础的,1.1完全兼容1.0。OpenGLES2.0则是参照OpenGL2.0规范定义的。简单的来说,OpenGLES是OpenGL针对嵌入式应用的简化版,也就是android使用的标准。OpenGLES1.1强调api的硬件加速,OpenGLES2.0更强调3D能力。
OpenGLES1.1和OpenGLES2.0之间的关系并不是旧版本和新版本之间的差别,而是一个针对相对低端的应用,一个针对高级应用,OpenGL官方的roadmap也是将这两个版本并行发展的。2.X并不能百分百兼容1.X。
Android现在支持1.X和2.X。
对于我们的应用来说,选择OpenGLES1.1已足够。理由如下:
1.1.1就能达到甚至略超过PSP的效果了(PSP实际上是一个PS2的简化版,它也不支持vertex或pixelshader)。2.x能达到更好的效果(大约接近DX9)。毕竟无论是以掌机(或者手机等便携设备)的耗电量,成本,还是屏幕尺寸来看,1.x都更有优势。jsr184标准的硬件实现就是ES_1.x。
2.如果追求最顶尖和图形质量和效果,定位为高端产品,那么就可以选择2.0,但成本和开发周期会很高。基本上2.x的接口是针对游戏主机而非掌机设计的,据说PS3就采用了ES_2.x。
3.android的目标应用不仅仅是手持设备,它的野心以后会触伸到游戏机甚至桌面等更为高端的领域,所以它现在支持更为高级的2.X。但是对于我们芯片的定位,如果选择支持OpenGLES的IP。支持OpenGLES1.1足矣。
第二部分:
Android中2D图形引擎流程(以下说明以android2.0及以上版本):
上图是android的框架图,在LIBRARIES中有三个模块是比较重要的。分别是Surface Manager(界面管理),OpenGL|ES,SGL(SGL就是上文提到的skia graphic layer,是android中为应用提供的一套2D图形库)。
Android的图形系统采用client和server架构。
Client server
因此我们对其的理解可以分成两个部分,应用和界面:
应用:2D接口会调用skia图形引擎,而skia是软件实现的。3D接口会调用OpenGL,OpenGL的库可以通过软件实现,如果存在硬件库的话则调用硬件。软件库libagl.so,硬件库libhgl.so.
此部分的调研疑问:所有资料几乎都说skia是软件实现,没法使用硬件,但是在台湾的一篇介绍skia的博文中却提到:skia它可以搭配OpenGL/ES与特定的硬体特征,强化显示的效果。这部分存在矛盾,需进一步验证(这部分的疑惑已找到,可以参考这篇文章http://blog.csdn.net/yili_xie/archive/2009/11/12/4803565.aspx)。
界面:界面主要是通过sufaceFlinger实现的,在2.0及以上版本,sufaceFlinger直接调用OpenGL ES API。此时如果存在硬件库则系统自动调用硬件库的api实现硬件加速。
如果系统没有支持OpenGL ES的硬件,但是能够支持一些简单的2D功能。则系统会调用软件库,OPEN GLES软件库中有一个copybit的适配文件,此时我们可以在hardware中实现copybit这个文件。系统在自动调用OpenGL ES软件库的时候,,系统通过适配文件找到copybit从而将一些功能通过硬件实现(这些功能主要包括内存的拷贝,放大缩小,旋转)。
如果系统没有支持OpenGL ES的硬件,甚至连简单2D硬件都没有,sufaceFlinger通过open gl es软件库实现。