您的位置:首页 > 移动开发 > Android开发

Android2.2,2.3,4.0 中如何使用GPU硬件加速原理 和游戏3D性能的提升

2012-11-09 14:47 781 查看
http://bbs.dospy.com/viewthread.php?tid=15445547&bbsid=648

http://blog.csdn.net/martingang/article/details/8142120

http://hi.baidu.com/aokikyon/item/70e973d043bad21c21e2500d

资料来自网络收集。

  1.名词解释
  GPU:GraphicProcessing Unit (图形处理器)
  OpenGL:OpenGraphic Library 定义了一个跨编程语言、跨平台的编程接口的规格,不同厂商会有不同的实现方法,它主要用于三维图象(二维的亦可)绘制。
  SurfaceFlinger:Android中负责Surface之间叠加、混合操作的动态库
  Skia:Android中的2D图形库
  libagl:Android中通过软件方法实现的一套OpenGL动态库
  libhgl:为区别libagl,自定义的一种叫法。特指GPU厂商提供的硬件实现的OpenGL
  composition:特指SurfaceFlinger对各个Surface之间的叠加、混合操作
  render:特指使用OpenGL动态库进行3D渲染
  copybit:Android使用2D引擎来加速图形操作(主要是Surface之间的composition操作)的一种技术,对应着一个或几个动态库。
  pmem:Android特有驱动,从linux内核中reserve物理连续内存,可以为2d、3d引擎、vpu等设备分配物理连续内存。
2 3D、2D引擎在Android中的使用方法
2.1Android如何使用2D、3D引擎
  Android在启动后,会在运行时根据配置文件加载OpenGL(libagl & libhgl)的实现,如果有libhgl实现,默认使用libhgl实现,否则使用libagl实现。

  Android OpenGL动态库使用方法:
  1. 判断是否含有egl.cfg文件,如果没有在加载libagl
  2. 如果有egl.cfg文件,则解析egl.cfg文件,根据egl.cfg文件加载对应libhgl和libagl
  3. 分别解析libagl和libhgl,获取libagl和libhgl中标准OpenGL函数的函数地址(函数指针)
  4. 系统在执行过程中,会通过函数指针调用到libagl或者libhgl中去,从而实现图形的绘制。

  OpenGL在Android中两个作用:
  1. 用于Surface的composition操作。
     SurfaceFlinger会调用到OpenGL中,通过libagl或者libhgl做Surface的组合、叠加操作。
  2. 用于图形图像的渲染
     Android framework会对OpenGL实现进行java层次的简单封装,在java应用程序中对OpenGL的调用最终会调用到libagl或者libhgl中去。
     很多第三方游戏、3D图库、某些launcher会使用OpenGL实现比较炫丽UI的特效。

  Copybit在Android中的作用
  Copybit在Android中主要用于Surface的composition操作。

  Skia在Android中的作用
  Skia是Android的2D图形库,用于绘制文字、几何图形、图像等。
  Skia的设备后端:Raster、OpenGL、PDF

2.2 使用GPU硬件加速需要做的工作
  1. Linux内核方面:
     1.1添加GPU驱动支持,以模块方式编译GPU驱动,Android启动时加载内核模块。
     1.2添加PMEM支持,预留内存供GPU使用
  2. Android方面:
     2.1添加copybit HAL
  我们使用copybit调用2D engine对surface composition进行硬件加速。这样可能会达到更大的性能提升效果(比起使用3Dengine)。
     2.2修改gralloc
  gralloc负责显存等的分配,以及对framebuffer操作。如果使用copybit,必须修改gralloc
     2.3修改libagl
  如果使用copybit,必须修改libagl,对libagl做部分hack,使之能够调用到copybit。
     2.4修改surfaceflinger
     如果使用 copybit可能需要做部分修改

3D性能提升
(有很多人问,这样会不会增加耗电什么的,我觉得只会减少耗电,毕竟3D本来就是gpu的强项,之所以系统还会调用cpu,是为了保证兼容性。本帖士只会让系统优先调用gpu)
用Root Explorer打开 /system/lib/egl

长按并选择打开egl.cfg文件
会有一下:
0 0 android
0 1 adreno200
删去第一行,使之成为: 0 1 adreno200
这样更改之后,3D游戏明显流畅,象限3D跑分轻松上700,其中星球的那一项可以达到60fps。
原理说明:
本文件的作用是帮助系统选择“在某些3D应用时,使用cpu还是gpu来解码”,0为是,1为否。
即每行语法如下: 情况A是否调用 情况B是否调用 调用什么

可以看到,原设置是,在情况A下,cpu和gpu都可以被选择,而情况B下则选择cpu。
问题就出在这个情况A,很多软件会默认选择cpu,可能因为它在第一行,所以我们要更改这一设定。
更改有三种方法,都是在xda上被广泛认可的:
1.删除cpu的解码包(同文件夹下的libGLES_android.so),这个是xda上最开始出现的做法,很野蛮,可能会出问题,强烈不推荐。
2.将第一行的两个0改成两个1,使之成为:
0 0 android
0 1 adreno200
这样就迫使软件使用gpu。那为什么不改成1 0呢?因为大神们还没搞清楚情况A和情况B的对应关系。
3.如本人所述,直接删除第一行。这样,软件默认使用gpu,因为没有cpu的描述,在gpu失败的情况下,系统还是会继续使用cpu。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: