您现在的位置:首页 > 博客 > Android开发 > UI开发 > 正文
Android2.2、2.3、4.0 中如何使用GPU硬件加速原理 和游戏3D性能的提升 实现GPU渲染
http://www.drovik.com/      2013-6-26 11:28:07      来源:www.drovik.com      点击:
资料来自网络收集。
    1.名词解释
    GPU
Graphic  Processing Unit (图形处理器)
    OpenGL
Open  Graphic 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物理连续内存,可以为2d3d引擎、vpu等设备分配物理连续内存。
    3D
2D引擎在Android中的使用方法
    2.1  Android
如何使用2D3D引擎
    Android
在启动后,会在运行时根据配置文件加载OpenGLlibagl & libhgl)的实现,如果有libhgl实现,默认使用libhgl实现,否则使用libagl实现。
     
    Android OpenGL
动态库使用方法
    1. 
判断是否含有egl.cfg文件,如果没有在加载libagl
    2. 
如果有egl.cfg文件,则解析egl.cfg文件,根据egl.cfg文件加载对应libhgllibagl
    3. 
分别解析libagllibhgl,获取libagllibhgl中标准OpenGL函数的函数地址(函数指针)
    4. 
系统在执行过程中,会通过函数指针调用到libagl或者libhgl中去,从而实现图形的绘制。
     
    OpenGL
Android中两个作用
    1. 
用于Surfacecomposition操作
             SurfaceFlinger
会调用到OpenGL中,通过libagl或者libhglSurface的组合、叠加操作。
    2. 
用于图形图像的渲染
             Android framework
会对OpenGL实现进行java层次的简单封装,在java应用程序中对OpenGL的调用最终会调用到libagl或者libhgl中去。
             
很多第三方游戏、3D图库、某些launcher会使用OpenGL实现比较炫丽UI的特效。
     
    Copybit
Android中的作用
    Copybit
Android中主要用于Surfacecomposition操作。
     
     
    Skia
Android中的作用
    Skia
Android2D图形库,用于绘制文字、几何图形、图像等。
    Skia
的设备后端:RasterOpenGLPDF
     

     
   2.2 
使用GPU硬件加速需要做的工作
    1. Linux
内核方面:
             1.1
添加GPU驱动支持,以模块方式编译GPU驱动,Android启动时加载内核模块。
             1.2
添加PMEM支持,预留内存供GPU使用
    2. Android
方面:
             2.1
添加copybit HAL
    
我们使用copybit调用2D enginesurface composition进行硬件加速。这样可能会达到更大的性能提升效果(比起使用3D  engine)。
             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下,cpugpu都可以被选择,而情况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

分享到:
发表评论(0)
姓名 *
评论内容 *
验证码 *图片看不清?点击重新得到验证码