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物理连续内存,可以为2d、3d引擎、vpu等设备分配物理连续内存。
3D、2D引擎在Android中的使用方法
2.1 Android如何使用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进行硬件加速。这样可能会达到更大的性能提升效果(比起使用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下,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。
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物理连续内存,可以为2d、3d引擎、vpu等设备分配物理连续内存。
3D、2D引擎在Android中的使用方法
2.1 Android如何使用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进行硬件加速。这样可能会达到更大的性能提升效果(比起使用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下,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。
发表评论(0)