我自己是从2010年开始使用U3D开发,之前是做大型端游,也用过虚幻引擎。2010-2011年,中国移动游戏开始爆发,就转到U3D做一些U3D手游开发,去年加入暴风魔镜从事应用开发。

资源制作成本增加,资源量增多,性能指标提高很多,网络环境要求更加苛刻,基于这些东西,我们也做了一些基于U3D自己的优化。


unity开发 unity开发vr_着色器

大规模的话,还需要一些U3D工程师。目前我们团队有4个安卓,还有6个U3D工程师。安卓做接口界面,还有C++开发。

当时设计了一个版本管理的配置文件,大家可以看到基本上我们的制作方式是在右面,有每个资源的命名,还有一些标志是否被压缩,比如说最后具体的路径。


unity开发 unity开发vr_服务器_02

把加到了VersionList上面,然后就进行二次拼接,这样保证本地版本和服务器版本的一致性。

将我所有的资源进行了一个大概的分类,对每一个分类都增加另外一套配置,可以看到那面,包括我们自己自定义的所有文件的合成,同样会带来一些路径,带来一些资源的ID,带来一些平台,当然也有类型压缩很多种方式,是否跟焦点绑定。


unity开发 unity开发vr_服务器_03

自己写一个类似于生成的工具,然后我们资源制作完之后会放到自己的资源夹子,是跟美术资源分离,但会存在一个预制体和资源捆绑关系,将预制体进行build生成Assetbundle,我将原有的进行更新,再重新写我的VersionList,保证自己的新生资源和老资源是一致的。


unity开发 unity开发vr_服务器_04

做一次资源的加密,当时制作是比较简单,现在会加更复杂的算法,比如一些越界对称非对称之类的,加这个之后呢我们遇到另外一个问题就是,因为VR,很多模型不像之前做手游可以删除一些,贴图可以小一些,他很大,这里的话资源加密之后又做了自定义压缩,当时我们找了很多相关的库,最后是通过我自己的源码,自己重新改过了一个自定义压缩库,他基本上我们在做完这步之后比以前的降了30%左右。

最后是资源管理和内存管理,我当时做的时候也是有一点困难,但是我当时就很庆幸的时候认识一个U3D工程师,首先是如果有相关连的时候会有三个游戏对象,当我释放一个的时候只将其中一个对象把他Release掉,另外两个不会,同样第二个释放掉也会把第二个Release掉,第三个全部Release掉的时候我彩绘全部UnLoad,有效降低内存使用,不会产生任何内存泄露。


unity开发 unity开发vr_unity开发_05

同样基于刚才的算法,增加一个索引表,增加一个索引计数,做一些++和--的操作,直到Index为零的时候才释放Bundle。


unity开发 unity开发vr_着色器_06

自己基于HTV接口实现3G缓冲下载,下载中会在内存中存放小的断点内存数据,之间的去写数据,然后当这个小的断点数据拿到内存值写到硬盘,之后下载到本地,下载完成跟本地文件进行拼接,在中间的小内存处理过程中会定期的去清理我的缓存,我知道大家有很多其他的接口可以完成缓存,但内存开销比较大。


unity开发 unity开发vr_服务器_07


unity开发 unity开发vr_服务器_08

做序列化压缩,压缩算法很简单,我每一次遇到List相关的我只保留第一个值,多余的相同的全部隐藏,这样当数据量比较大的时候,我们平均大概能优化70%的量。

另外就是一些渲染性能,我们如果大家最近在用U3D5.4Beta版本可以发现里面增加很多接口,比如说GPU,当时在我们使用的版本中是没有的,当时遇到了很多渲染性能的问题,因为当时的项目要求就是效果要好,画面要极致,但要流畅,所以当时做了很多扩展。


unity开发 unity开发vr_unity开发_09


unity开发 unity开发vr_贴图_10

建了一个共享线程,用GPU实现贴图拼接,然后他是一个异步进行的,渲染过程中可能会有很多模型,但是可能在一开始进行的时候会有点慢,但你加载过程之后可能大概几秒之后会把他合成一个周扣,就瞬间性能提升下来,如果5.4大家可以去看U3D的接口,应该跟这个类似的算法。


unity开发 unity开发vr_着色器_11

比如像一些可以用多少网格,多少三角形,有多少顶点,多少张贴图,场景可以做多大,我要占多少内存,其实这种有数据指标的东西比较好掌握合理解,但是涉及渲染的时候,他们用起来开始产生困惑,比如经常看到一些公司里面的一些游戏,他很简单的一个游戏的模型,他要表达一个效果,然后他可能会使用很多的寄存器和很多的贴图,但美术在使用着色器上只会用几个参数和几张贴图,那个时候当时也分析了他们的一些诉求,所以基于他们的渲染需求,我自己写了很多的着色器方便他们做各种各样效果,当他们效果匹配的时候,基本上让他们的着色器达到最优化,分析ALU,让他每次的每个使用是最优化的,不会有多余浪费和冗余。


unity开发 unity开发vr_着色器_12

虽然地刷很好用,那个时候就包括LED都很好用,但唯一一个就是最早的时候网格非常多,当时开使用一些自己创建的一些地形,地形模型去在场景摆放,摆放过程中发现他没有贴图混合功能,然后我当时就是有分析U3D的系统,自己去开发了一个BlendShader还有地表混合着色器,我们的植被是可以刷的,树干地表石头都可以采取Blend绘制,然后整个模型只有一个,网格数也是非常稀少的。


unity开发 unity开发vr_着色器_13

我以前去做一些游戏逻辑和人工智能,大家现在都知道大家都在写脚本,但基本上我当时也做过开发,比如一些内存加密等等,但是依然解决不了就开发的时候很多漏洞和调试问题,尤其是人工智能这一块,我想实现一个流程在引擎中,那个时候Animator出来了,利用这个状态图实现有线状态机,这些状态机的脚本都在本地里面存着,我只需要更新服务器上的小怪的AI,也是可以的。


unity开发 unity开发vr_着色器_14

找到Mono虚拟机的原码,同样开发DLL也进行了重新编译,基本上可以进行加密,最后发布到Application中。


unity开发 unity开发vr_贴图_15


unity开发 unity开发vr_unity开发_16

那个时候开使用大数据,将所有的机型配置分级别,对他们所用的配置,数据的话会直接存到服务器端,第一次登陆打开游戏的时候,会把机型发送到服务器上,服务器根据我本地的配置在服务器寻找相关的配置资源,游戏打开的时候自动的帮玩家适配好,根据机型最优化的表现方式。