android中如何使用GPU实现硬件加速,3D渲染

已开通新的博客,后续文字都会发到新博客

http://www.0xfree.top

---

首先来看一些名词解释

    GPU:Graphic  Processing Unit (图形处理器)
    OpenGL:Open  Graphic Library 定义了一个跨编程语言、跨平台的编程接口的规格,不同厂商会有不同的实现方法,它主要用于三维图象(二维的亦可)绘制。
    SurfaceFlingerAndroid中负责Surface之间叠加、混合操作的动态库
    SkiaAndroid中的2D图形库
    libaglAndroid中通过软件方法实现的一套OpenGL动态库
    libhgl为区别libagl,自定义的一种叫法。特指GPU厂商提供的硬件实现的OpenGL
    composition特指SurfaceFlinger对各个Surface之间的叠加、混合操作
    render特指使用OpenGL动态库进行3D渲染
    copybit:Android使用2D引擎来加速图形操作(主要是Surface之间的composition操作)的一种技术,对应着一个或几个动态库。
    pmemAndroid特有驱动,从linux内核中reserve物理连续内存,可以为2d、3d引擎、vpu等设备分配物理连续内存。

 3D、2D引擎在Android中的使用方法
   1、Android如何使用2D、3D引擎
    Android在启动后,会在运行时根据配置文件加载OpenGL(libagl & libhgl)的实现,如果有libhgl实现,默认使用libhgl实现,否则使用libagl实现。
     
   2、Android OpenGL动态库使用方法
    1. 判断是否含有egl.cfg文件,如果没有在加载libagl
    2. 如果有egl.cfg文件,则解析egl.cfg文件,根据egl.cfg文件加载对应libhgl和libagl
    3. 分别解析libagl和libhgl,获取libagl和libhgl中标准OpenGL函数的函数地址(函数指针)
    4. 系统在执行过程中,会通过函数指针调用到libagl或者libhgl中去,从而实现图形的绘制。
     
   3、OpenGL在Android中两个作用
    1用于Surface的composition操作
             SurfaceFlinger会调用到OpenGL中,通过libagl或者libhgl做Surface的组合、叠加操作。
    2)用于图形图像的渲染
             Android framework会对OpenGL实现进行java层次的简单封装,在java应用程序中对OpenGL的调用最终会调用到libagl或者libhgl中去。
             很多第三方游戏、3D图库、某些launcher会使用OpenGL实现比较炫丽UI的特效。
     
   4、Copybit在Android中的作用
    Copybit在Android中主要用于Surface的composition操作。
     
     
    5、Skia在Android中的作用
    Skia是Android的2D图形库,用于绘制文字、几何图形、图像等。
    Skia的设备后端:Raster、OpenGL、PDF
    
 使用GPU硬件加速需要做的工作
    1. Linux内核方面
             1.1添加GPU驱动支持,以模块方式编译GPU驱动,Android启动时加载内核模块。
             1.2添加PMEM支持,预留内存供GPU使用
    2. Android方面
             2.1添加copybit HAL
    我们使用copybit调用2D engine对surface 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应用时,使用cpu还是gpu来解码”,0为是,1为否。
即每行语法如下: 情况A是否调用 情况B是否调用 调用什么

可以看到,原设置是,在情况A下,cpu和gpu都可以被选择,而情况B下则选择cpu。
问题就出在这个情况A,很多软件会默认选择cpu,可能因为它在第一行,所以我们要更改这一设定
更改有三种方法,都是在xda上被广泛认可的:
1.删除cpu的解码包(同文件夹下的libGLES_android.so),很野蛮,可能会出问题,强烈不推荐
2.将第一行的两个0改成两个1,使之成为: 
0 0 android
0 1 adreno200
这样就迫使软件使用gpu。那为什么不改成1 0呢?因为大神们还没搞清楚情况A和情况B的对应关系
3.如本人所述,直接删除第一行。软件默认使用gpu,因为没有cpu的描述,在gpu失败的情况下,系统还是会继续使用cpu

猜你喜欢

转载自blog.csdn.net/beijing2008lm/article/details/11375741