精通安卓性能优化-第八章(三)

OpenGL ES

在现在的Android设备和应用上3D渲染变得越来越重要。成为一个3D渲染专家需要很多的时间,为了使用3D渲染,接下来的部分介绍几个简单实现的技术,以及需要意识到的几个基本的思想。如果想学习更多的Android OpenGL ES,你可以参考"Pro OpenGL ES for Android"。
大多数当前的Android设备支持OpenGL ES 1.1和OpenGL ES 2.0,老的设备仅支持OpenGL ES 1.1。到2011年11月,大约90%的使用安卓市场的设备支持OpenGL ES 2.0。
OpenGL ES是Khronos Group提出的标准,存在几种实现。多数Android设备的通用GPU支持的OpenGL ES是:
(1) ARM Mali(比如:Mali 400-MP4)
(2) Imagination Technologies PowerVR(比如: PowerVR SGX543)
(3) Nvidia GeForce(Nvidia Tegra)
(4) Qualcomm Adreno(从AMD, formerly ATI Imageon, 整合到Qualcomm Snapdragon)

Extensions

OpenGL标准支持扩展,允许在某些GPU注册新的feature。比如,如下的扩展被Samsung Galaxy Tab 10.1所支持(基于Nvidia Tegra 2):




Listing 8-15给出了如何获取一个设备支持的扩展。因为Android模拟器不支持OpenGL ES 2.0,保证在一个真实的设备上运行你的带。
Listing 8-15 OpenGL ES扩展

// 扩展列表作为单独的字符串返回(解析它去找到指定的扩展)

String extensions = GLE20.glGetString(GLES20.GL_EXTENSIONS);

Log.d(TAG, "Extensions: " + extensions);

需要一个OpenGL context以便去执行Listing 8-15的代码,获取扩展的列表。比如,你可以在GLSurfaceView.Renderer的onSurfaceChanged()执行代码。如果在没有OpenGL ES可用的情况下运行这段代码,你将在Log看到"call to OpenGL ES API with no current context"。
就像你看到的,上面的扩展可以被分到几个组:
(1) GL_OES_*
(2) GL_ARB_*
(3) GL_EXT_*
(4) GL_NV_*
GL_OES_*扩展是被Khronos OpenGL ES Working Group增强过的扩展。尽管这些扩展不被OpenGL ES需要,但是广泛的可用。
GL_ARB_*扩展被OpenGL Architecture Review Board增强。GL_EXT_*扩展被多个提供商支持,GL_NV_*被Nvidia单独支持。通过观察支持什么样的扩展,你经常可以分辨哪个公司提供设备的GPU:
(1) ARM使用GL_ARM前缀
(2) Imagination Technologies使用GL_IMG前缀
(3) Nvidia使用GL_NV前缀
(4) Qualcomm使用GL_QUALCOMM, GL_AMD和GL_ATI前缀

NOTE:参考http://www.khronos.org/registry/gles和http://www.opengl.org/registry。

因为不是所有的设备支持同样的扩展(hello, fragmentation),当针对特定的设备优化的时候需要特别认真,因为在一个设备上能够工作,不一定能在另外一个设备工作。通常的示例包括使用Non-Power-Of-Two(NPOT)textures或者一个设备支持的texture压缩格式,在其他设备可能不支持。如果你计划在非Android的设备上,同样需要去检测设备支持哪些扩展。比如,当前的苹果的iPhone、iPod、iPad设备基于Imagination Technologies PowerVR(可能不会共享同样的扩展),但是将来的模块可能不会基于PowerVR。

Texture Compression

材质将会定义你的OpenGL ES应用看起来是什么样子。尽管使用非压缩的材质很简单,这样的材质会很快膨胀你的应用。比如,一个没有压缩的256*256的RGBA8888材质可能会使用256K的内存。
没有压缩的材质会负面影响性能因为他们不像压缩后的材质那样可缓存(因为他们的大小),他们需要更多的内存访问(同样影响电能消耗)。使用非压缩材质的应用同样很大,因此需要更多的时间去下载和安装。另外,通常你的Android设备的内存数量是有限的,所以你的应用应该使用尽可能少的内存。
在上面的列表中,如下的扩展给出了哪个材质压缩格式被Samsung Galaxy Tab 10.1支持:
(1) GL_OES_compressed_ETC1_RGB8_texture
(2) GL_EXT_texture_compression_latc
(3) GL_EXT_texture_compression_dxt1
(4) GL_EXT_texture_compression_s3tc
ETC1压缩格式由Ericsson(ETC stands for Ericsson Texture Compression)创建,被大多数Android设备支持(支持OpenGL ES 2.0的全部都支持)。因此最安全的选择是尽量的以更多的设备为目标。这个压缩格式使用每个像素4位而不是24(ETC1 不支持 alpha)因此达到了6X压缩率:包括16字节的头,256*256的ETC1材质为32,784字节。
存在创建ETC1材质的多个工具。Android SDK包含etc1tool,一个的命令行工具编码PNG图像到压缩后的ETC1图像。比如,下面一行显示了如何压缩lassen.png(183K),给出原始图片和压缩后图片的不同:

etc1tool lassen.png --encode --showDifference lassen_diff.png
输出文件,如果没有指定,会基于输入文件的名字产生。在这个实例中,输出文件是lassen.pkm(33K)。Figure 8-3给出了压缩图像和原图的不同。

Figure 8-3 原始图像(left)和与压缩图像的不同(right)



NOTE: etc1tool同样可以用来解码一个ETC1图像到PNG图像。关于ect1tool更多的信息,参考
http://d.android.com/guide/developing/tools/etc1tool.html。

不幸的是,Android SDK的etc1tool不提供很多的选项。那些希望去微调压缩和视觉质量的,推荐另外一个工具:etcpack。etcpack工具可以在Ericsson网站下载(http://devtools.ericsson.com/etc),允许更多的选项:
(1) 压缩速度(slower speed = higher quality)
(2) 误差度量(感性或者非感性)
(3) 方向
在发布你的应用前,你应该尽量使用最好的性能,因为ETC1 texture被离线产生(即不是Android设备自己产生的)。因为人眼对绿色的敏感度比红色或者蓝色要高,你需要选择感性的作为误差度量。(算法将使得绿色更加接近原始值,以红和蓝为代价,减少噪声)
不同的地方可能不明显,没有理由去发布一个应用使用更低的质量的材质,当更高质量的ETC1材质将是同样的大小。产生高质量的texture需要更多的时间,因此很多开发者在开发过程中选择使用低质量的texture,你需要经常记得在发布应用之前切换到高质量。

或者,你可以使用ARM Mali GPU 压缩工具,在http://www.malideveloper.com/developer-resources/tools,免费。这个工具提供和etcpack相似的选项,有一个图形界面(同样提供了一个命令行版本)。Figure 8-4给出了ARM Mali GPU压缩工具压缩同一个文件的表现。

Figure 8-4 ARM Mali GPU压缩工具



Figure 8-5给出了高质量压缩和低质量压缩的不同。再说一次,不同不明显。

Figure 8-5 高质量(left),中间(middle),和低质量(right)


就像你可以在ARM Mali开发网站看到的,许多其他的工具可用。你可以找到许多授权和调制工具,在ARM、Imagination Technologies,Nvidia和高通的网站。


比如,Imagination Technologies同样提供了一个工具去创建压缩的材质,PVRTexTool,Nvidia网站提供一个完整的SDK(包括Android SDK,NDK,Eclipse和示例代码)。

NOTE:你需要注册去获取访问这些网站的权限。

从Android 2.2(API 8)开始,定义如下的类帮助你使用ETC1 texture:
(1) android.opengl.ETC1
(2) android.opengl.ETC1Util
(3) android.opengl.ETC1Util.ETC1Texture
你的应用可以使用ETC1.encodeImage()和ETC1Util.compressTexture()方法动态压缩图像到ETC1材质。当ETC1材质不可以离线产生的时候,这很有用,比如材质基于设备上面存储的图片(可能是用户联系人里面的一个图片)。

TIP:尽管ETC1不支持透明(在压缩的材质没有alpha通道),你可以使用另外一个单通道材质仅包含透明度信息,在一个shader中组合他们。

其他压缩格式

尽管ETC1是最通用的texture压缩格式,存在被某些设备支持的其他格式。包括:
(1) PowerVR Texture Compression(PVRTC)
(2) ATI Texture Compression(ATC or ATITC)
(3) S3 Texture Compression(S3TC), with DXT1 to DXT5 variants
你需要依赖于你的目标设备试验不同的压缩格式。因为一个特殊的GPU可能会使用自己的压缩格式优化(比如,PowerVR GPU使用PVRTC压缩格式优化),你可以选择合适的压缩格式而不是ETC1以达到更好的结果。

NOTE:你可以使用苹果的IOS texturetool产生PVRTC材质。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值