王 园 园
(淮北职业技术学院, 安徽 淮北 235000)
手机Android系统具有良好的开放性,程序可扩展性强,应用广泛。由于手机硬件的不断升级更新,用户对手机的画面品质要求也不断提高。越来越多的三维应用软件不断推出,3D模型的显示效果就成了手机的重要性能之一。本次研究将在Android框架中引入OpenGLES图形接口开发三维模型应用,给出解析模型并加载应用的优化处理方式。
Android操作系统是全球最大的智能手机操作系统。系统架构分为4层,从上到下依次是应用程序层、应用程序框架层、系统运行库层、Linux内核层。
不同于其他手机操作系统,Android操作系统中的一些应用程序可以被第三方应用程序替换,可由开发者和使用者进行个性化修改。
从应用程序框架层开始,直接使用该层提供的组件来进行开发,以避免部分组件被重复使用。
系统运行库层分为系统库和Android运行2部分。系统库主要用来支撑应用程序框架,它能够将应用程序框架层与Linux内核层连接在一起; Android运行中使用Java编写应用程序并予以执行。在运行过程中,可以将系统运行部分分为核心库和Dalvik虚拟机:核心库能够提供大多数API,且很多功能是用Java语言来编写,同时也包含了部分如android.os、android.NET、android.media等非常重要的Android核心API; Dalvik虚拟机内Android的应用程序不是由多个程序运行,而是每个应用程序都拥有一个专属进程,应用程序在其专属进程中都有一个Dalvik虚拟机与之对应,并在其中被执行。与一般的虚拟机不同的是,Dalvik虚拟机并非使用栈来暂时存放数据,而是通过寄存器来暂存数据,能够支撑多个虚拟机并将内存资源合理优化。尤其是,Android应用程序在虚拟机中执行的是,转换工具dx转换Java字节码而生成dex格式的中间码,执行的并非编译后的字节码。
最底层是Linux内核层,其核心系统服务如安全性管理、内存管理、进程管理、网路协议及驱动模型都依赖于Linux内核。由于Android系统的应用基于Linux 2.6内核,所以这一层为Android系统的正常运行提供了底层支持。
Android系统的管理,是通过Activity实现进栈管理。当来到一个新的Activity后,此Activity即被加入到Activity栈顶,之前的Activity位于此Activity底部。Acitivity通常存在4种可能的状态:运行状态、中断状态、停止状态、消灭状态。
OpenGLES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,是专门针对嵌入式设备而设计,其绘制模式包括:glBegin(开始)、glEnd(结束)、GL_QUADS(四边形)、GL_POLYGONS(多边形)等。
在OpenGLES中,只允许采用三角形来搭建物体。在OpenGLES中,坐标系统采用的是三维笛卡尔坐标系及左手标架坐标系。初始情况下,y轴平行于屏幕的竖边,x轴平行于屏幕的横边,z轴垂直于屏幕的平面。
OpenGLES着色语言是一种高级的图形编程语言,源于应用广泛的C语言,具有RenderMan及其他着色语言的一些优良特性,易于学习掌握。与传统通用编程语言不同的是,OpenGLES着色语言提供了更加丰富的原生类型,如向量、矩阵等。
OpenGLES着色语言具有以下特性:(1) OpenGLES着色语言是一种高级的过程语言(非面向对象);(2) 对顶点着色器、片元着色器使用同样的语言;(3) 基于CC++的语法及流程控制;(4) 完美支持向量与矩阵的各种操作;(5) 通过类型限定符管理输入与输出;(6) 拥有大量的内置函数,可提供丰富的功能。
OpenGLES着色语言中同时也提供了很多的内置函数,这些内置函数通常都是以最优的方式来实现。它们大部分都同时适用于顶点着色器和片元着色器,但也有少部分只适用于顶点着色器或者片元着色器。
stl文件是计算机图形应用系统中表示三角形网格的一种文件格式,将模型文件中的三角形顶点信息提取出来即可读取得到模型中所有点的信息。但是,对于3D模型的显示与编辑,因其位置、大小、方向都是随机的,所以需要获得一个模型的边界信息(模型分别在x、y、z方向的最大值和最小值),使模型可以在GLSurfaceView上以近似大小居中显示。
首先,定义Model类来表示一个模型对象(包含三角面个数、顶点坐标数组、每个顶点对应的法向量数组、三角面的属性信息),然后将stl模型文件转化为Model对象。这里,先定义一个STLReader类,读入文件,然后再进行文件的解析。
依据以上理论,开发出的安卓3D模型应用具备以下功能:
(1) 点击模型1次会获得控制权,再次点击就会失去控制权;
(2) 连续点击2次屏幕,屏幕会在移动和旋转模式之间切换;
(3) 选择旋转的时候,滑动屏幕会使模型以一定的初速度旋转;
(4) 在编辑框输入模型名字,点击确定,更换模型;
(5) 通过星型按钮切换光照和模型的控制方式;
(6) 通过滑块条进行缩放;
(7) 多点触碰屏幕隐藏或显示控件界面。
所有复杂几何图形由一个或多个三角形列表组成,每个顶点位置、顶点法线及其他类型的数据基本都由一个或多个三角形所共享。所创建的是来自索引缓存且具有唯一顶点数据的数组(没有重复的数据),该数组可用作表示几何图形的最小数组。为了正确绘制模型,必须使用合适的索引组来表示顶点数据数组中的每个三角形,然后使用该索引数组绘制几何图形。此索引数组非常小且受到GLES的默认限制,因而必须将该数组指定为unsignedshort。
将索引数组发送到相关联的GLES绘图指令(glDrawElements),避免反复发送该索引数组。据此,构建并使用优化的顶点数据VBO(VertexBufferObject)和VAO(VertexArrayObject)来处理顶点数据属性。
接下来要优化三角形索引,从而大幅减少绘制三角形所需的索引数量。OpenGLES提供了一种更优化的绘制三角形替代方法 —— GL_TRIANGLE_STRIP。使用该模式可以重复使用三角形最后2个索引,只需另指定1个索引就可以创建新的三角形。绘制一个四边形,以前需要发送6个索引,现在只需发送4个索引。
在理想情况下,所有三角形及其边缘都以一种易于构建单个三角形带的方式对齐;但是在实际几何图形中这种情况很少出现,反而有时三角形带构建过程被停止,然后需重新创建另一个退化三角形,该过程称为stitching(拼接)。
在少数情况下,使用三角形带可能会比使用三角形产生更多的索引。在这种情况下,可以继续使用三角形,不用三角形带。指定的顶点缓存越大,最后的索引数组也就越小。在移动设备GPU上,顶点缓存不存在;所以,索引数量越少,几何图形的绘制速度就越快,即使使用默认顶点缓存也可以优化索引(优化应该在使用定制的命令行工具导出对象时脱机完成)。优化较大顶点的缓存之后,可以进一步优化最终索引。当然,如果一味地增加缓存,将会更加费时,或得不偿失。
与桌面PC的显卡相比,便携式设备GPU在视频内存应用上受到很大的限制,所以应尽可能使纹理分辨率最小,以便最大限度地节约内存。
纹理越大,用来拾取和插入像素的提取操作就越慢。优化其内存空间的最佳解决方案是,首先调整纹理的大小,然后将其转换为16位的数据。对于不同的纹理类型,必须选择最适合的像素类型,使每个颜色分量都尽可能多地保存颜色分辨率。
虽然将24位、32位的纹理转换为16位的纹理,会使纹理质量有所损失,但是通常损失不显著,且所需的内存空间减为原来的一半,这些损失可以接受。
目前所开发的安卓三维模型应用仍比较粗糙,但可塑性很强。在后续开发中将逐步完善以下功能:(1) 继续尝试解析更多格式的模型;(2) 在各个模型格式间自由转换;(3) 添加更多强大的模型编辑功能;(4) 可自制简单模型;(5) 加快模型读取的速度;(6) 实现跨平台使用。
3D模型应用的未来发展前景非常广阔。目前在虚拟现实的蓬勃发展和智能手机的快速成长之下,手机上的AR、VR应用应运而生,而让用户身临其境的体验离不开高质量的模型显示。手机具有便于携带和功能强大的特点,伴随着硬件与软件技术的革新,开发者需要提高程序的读取效率并降低内存。这些来自用户和开发者的需求会促使这个领域不断地产生新的技术。
[1] 王菲飞.基于Android平台的手机恶意代码检测与防护技术研究[D].北京:北京交通大学,2012:12-16.
[2] 童振飞.Android恶意软件静态检测方案的研究[D].南京:南京邮电大学,2012:8-12 .
[3] 吴想想.基于Android平台软件开发方法的研究与应用[D].北京:北京邮电大学,2011:6-10.
[4] 党李成.基于Google Android智能手机平台的研究与应用[D].合肥:安徽大学,2010:12-14.
[5] 廖明华,郑力明.Android安全机制分析与解决方案初探[J].科学技术与工程, 2011(26) :6350-6355.
[6] 张继永.浅析Android系统的软件安全设计[J].硅谷, 2010(23):38-38.
[7] 刘昌平,范明钰,王光卫,等.Android手机的轻量级访问控制[J].计算机应用研究, 2010(7):2611-2613.
[8] 宋杰,党李成,郭振朝,等.Android OS手机平台的安全机制分析和应用研究[J].计算机技术与发展, 2010(6):152-155.
[9] 周毅敏,陈榕.Dalvik虚拟机进程模型分析[J].计算机技术与发展,2010(2):83-86.
[10] 林清,董占球.XML与HTML在Web环境中的应用分析[J].计算机应用, 2001(增刊1):67-68.