马瑞 (安徽电子信息职业技术学院软件学院,安徽 蚌埠233030)
三维虚拟技术的应用将会越来越广泛,其中采用Unity3D技术开发的三维虚拟系统具有模型可视化、虚拟与现实交互、实时更新虚拟模型和支持多平台等优点,是目前众多三维虚拟设计软件中开源代码及功能应用全面的三维虚拟引擎[1-2]。通常情况下,虚拟系统在Web服务器端发布,设计人员将系统中所有资源存放在Web服务器供用户使用。用户在使用系统时将所需要的系统资源文件全部下载完毕后,软件才能动态的加载并创建系统里的场景和角色等对象,然后才能动态的将脚本绑定在虚拟数字对象上,动态地将贴图赋予虚拟数字对象,必须动态地完成各种加载操作之后系统才能有效的运行,这样会大大影响用户从系统服务器中得到响应的时间以及在用户端系统动态运行的效率。为此,笔者利用Unity3D提供的Prefab和Assetbundle功能对系统里的模型资源、UI资源进行预置、封包和解包,当从服务器上将先预置后封包的Assetbundle文件下载后直接实例化,再放入到三维虚拟数字校园系统中,这样可以有效提高系统在Web用户端的运行效率。
预置是Unity3D中提供给设计人员的一种资源类型,其是存储在项目视图中的一种可重复使用的三维模型资源对象[3]。预置可以重复多次地载入到多个不同场景中,当场景中载入了一个预置对象,系统就会自动创建对应的实例,且所有预置实例都链接到原始预置本身,也就是说预置实例都是预置本身的克隆。不管项目存在多少实例,当对预置进行任何更改,将会看到这些更改都会被应用到该预置对象的所有实例中。一般情况下,预置封包时占用很少的存储空间(不超过1KB)。在实际开发过程中,预置对象会关联模型、特效、界面、声音、场景和脚本等资源,关联上述资源后,预置对象的存储就会随着变大,因而在系统设计过程中应尽量减少预置对象的重复关联,由此减少系统消耗的内存资源[4]。
一般情况下,设计人员会把脚本文件绑定到预置对象上,然后再进行资源封包,但是移动平台不支持脚本更新,如将JumpTest.js这条测试脚本绑定在预置中,系统移动平台通过服务器下载该封包,再载入到工程中会发生JumpTest.js测试脚本不能被正常加载和执行的现象[5]。在实际系统中,存在需要大量的动态加载和执行脚本文件的需求,为了满足上述需要,可以在脚本中添加Public变量,通过Inspector脚本中的Public参数实现脚本更新。如果本地包含JumpTest.js脚本,系统将把该脚本绑定在从服务器端下载的预置中并且被执行,但是当本地工程文件中没有JumpTest.js脚本文件时,那么从服务器端下载的预置中的脚本文件将永远不被执行。因此,应通过在脚本文件中添加Public变量,以及对Public变量参数的修改来实现移动平台的脚本更新。
场景需要保存模型及该模型文件的相关文件和坐标信息,并且烘培该场景的光信。由于烘培不能被重新加载,因此只能烘焙场景特有模型,被多场景共用的模型必须动态加载。由于场景中存在很多公用模型,因而如何设计封装规则封包场景资源就显得尤为重要[6]。封包场景资源占用内存的大小=公用模型的大小×场景的个数的大小,这表明场景资源封包会重复占用大量的内存资源。通过研究场景封包的策略,首先烘培整个场景,然后丢掉其中的公共模型,只保留特有的模型。采用XML文件记录被丢掉的公共模型在场景中的坐标数据,最后将其封包在不同的封包文件中(见图1)。
由于系统中公共资源的封包被加载的次数更多,因此该封包被设计成在内存中常驻。系统场景封包的执行过程设计为,首先系统下载场景的封包,然后依据场景封包文件中的XML文档的坐标信息,从内存中调用常驻的公共资源封包动态地再加载到场景中,最终实现整个场景的加载。
图1 公共资源与多场景封包架构图
通常情况下,系统封包都是由设计人员根据系统规划,人工判断每个场景中哪些是其特有资源,哪些是和其他场景共用资源,上述处理方式效率低且容易出错。为此,设计一种自动封包方法,设计程序对所有场景进行遍历,记录资源的被使用信息,判断哪些资源被场景封包,哪些资源独立封包,最终完成系统资源的封包工作。
由于Assetbundle封包可以同时放在服务器或者本地,并且下载读取的方式完全一样,因而设计人员可以在系统开发阶段把资源封包建设在本地,当系统完成前期测试后再把资源封包上传到服务器上进行公共测试,这样有利于系统在公共测试和发布后的不断更新[7]。
读取封包(WWW bundle=new WWW(path);WWW.LoadFromCacheOrDownload(path,5))分为2种方式:方式1是bundle只能保存在内存中,一旦退出系统再进入还得重新下载,因而该方式不适用;方式2是将Unity3D下载Assetbundle到本地中,其原理是通过版本号和下载地址在本地寻找是否有该Assetbundle,如果有则直接返回对象,如果没有则根据下载地址重新从服务器或者本地下载。
利用专业Unity3D性能测试工具Profiler测试系统,得到未采用封包策略的系统运行内存测试数据如图2所示,而采用封包策略后的系统运行内存测试数据如图3所示。比较图2和图3可知,未来用封包策略占用的内存资源数据为0.52GB,而采用封包策略占用的内存资源数据为386.5MB,表明采用封包策略后系统占内存空间明显减少,因而系统在客户端的运行效率更高。
采用Unity3D提供的Prafab及Assetbundle对三维虚拟数字校园系统的模型文件进行预置和封包,并采用公共模型Assetbundle单独封包,这样可以有效减少常驻内存的模型文件数量,从而起到提高系统运行及数据再次加载的效率。今后,对基于Unity3D的三维虚拟数字校园系统来说,如何提高客户端的下载速度、场景在客户端加载的效率及系统在客户端运行的效率和稳定性,需要进一步加以研究并使之完善。
图2 未采用封包策略的内存测试数据图
图3 采用封包策略的内存测试数据图
[1] 王星捷,李春花 .基于Unity3D平台的三维虚拟城市研究与应用 [J].计算机技术与发展,2013(4):241-244.
[2] 李保杰,于法展,李战成 .基于OpenGL虚拟校园漫游系统的设计与实现 [J].苏州科技学院学报,2006,22(19):45-48.
[3] 朱慧娟 .基于Unity3D的虚拟漫游系统 [J].计算机系统应用,2012,21(10):36-39,65.
[4] 宣雨松.Unity3D游戏开发 [M].北京:人民邮电出版社,2012.
[5] 邹静 .迎接互联网的明天——玩转3Dweb[M].北京:电子工业出版社,2011.
[6] Ramasundaram V,Grunwald S,Mangeot A,et al.Development of an environmental virtual field laboratory [J].Computers &Education,2005,45(1):21-34.
[7] Mac E,Cai G,Sharma R.Enabling collaborative geoinformation access and decision-making through a natura,multimodal interface [J].International Journal of Geographical Information Science,2005,19(3):267-292.