解决LightMap和Fog导致FBX打包AssetBundle的容量增大的问题

这次来说说LightMap和Fog导致FBX打包AssetBundle产生的容量问题。下面会做一些小测试,来看看有那些方面会影响FBX打包AssetBundle的容量。
首先我准备了一个普通的fbx网格模型:
这里写图片描述
然后给他设置了AssetBundleName
这里写图片描述
正常打包成AssetBundle,可以看到容量是91k。
这里写图片描述

也许很多人都知道,如果把一个场景打包成AssetBundle,需要在Graphics里面设置一下LightMapMode和FogMode,不然打包后的AssetBundle加载后是没有LightMap和雾的效果的。所以我这里也设置一下。
这里写图片描述
打开Graphics设置面板,可以看到这两个设置的地方默认都是自动(automatic)的
这里写图片描述
下面改成手动,然后把勾全部勾上:
这里写图片描述
再次打包,会看到AssetBundle容量变成了386k。
这里写图片描述
这是一个很奇怪的现象。按照Unity官方的说法,Shader stripping只是简化打包出去的AssetBundle的shader而已。如果你的项目的shader是单独打包成依赖的,如果设置了手动的这两个模式,实际上打包出去的Shader也的确变大了很多的。但实际上,现在影响到了FBX的容量。

所以接下来,把一些我觉得用不到的选项去掉,变成下图这样。
这里写图片描述
忘记截图了,这次打包出来的容量是150k。

这个地方说明一个问题,如果想要LightMap和雾的效果,也要看着自己用到哪些效果才来打钩,不然会导致打包的AssetBundle容量增大很多的。
其实我自己的做法是,完全不勾这里的选项,让打包的AssetBundle完全没有LightMap和Fog,这时候fbx的容量是最小的。然后,把用到的shader放一份在主项目的Resources里面。然后加载完场景之后,通过Shader.Find找到相同名字的Shader,通过替换所有场景物体的Material上的shader,这样LightMap和Fog就会正常显示。
不过这种做法也是有缺点的,因为AssetBundle会带一份Shader出去,然后Resources里面也有一份相同的,当加载后再Shader.Find替换,就会同一个Shader出现了2份在内存里面。如果处理不当,可能还会出现3份、4份甚至更多,这样就造成了内存的冗余溢出。
我解决这个问题的做法是,所有美术项目的shader打包成同一个AssetBundle,然后在游戏启动的时候先加载这个shader的AssetBundle,然后永驻内存。这样,其他模型加载的时候,外部加载的shader最多只有一份。然后内部通过Shader.Find找到的Shader,做一个缓存,通过同一个名字加载的Shader只会有一份。这样,还是会出现冗余,但能保证只有2份相同的,不会继续溢出。
如果有更好的做法,欢迎各位分享。

然后来说说prefab和fbx之间的冗余问题。
把刚才那个fbx做成prefab
这里写图片描述

然后设置prefab的AssetBundleName:
这里写图片描述

打包出来:
这里写图片描述
看到结果,fbx仍然是91k,prefab出来的容量是67k,两者加起来就是158k。

接下来,把fbx的AssetBundleName去掉,然后打包:
这里写图片描述

这次看到的结果是,只有prefab被打包成AssetBundle,容量是91k
这里写图片描述
这说明了,实际上就算把预设依赖的fbx打包AssetBundle,实际上还是产生了冗余。所以,最好的做法,是不要直接使用fbx,所有的fbx都先做成预设,然后再用。然后打包依赖时,打包到prefab这一层就够了。

最后说说Optimize Mesh Data:
这里写图片描述
在Player Setting下面有这么个选项,按照官方的说法,作用是精简网格模型数据。比如说一个网格模型上面有很多信息,包括了法线、切线、顶点颜色,等等。如果使用在这个网格模型上面的材质根本没有用到这些信息,那么,勾选了这个选项之后,在打包时,Unity会帮你自动去掉这些没用的网格数据,让打出来的包容量更小。
经过我自己项目的测试,我现在的项目所有美术资源打包出来是700多M,使用了这个选项之后,总体容量减少了30-50M。实际上我觉得减少得不算多。
而且,这个东西是一把双刃剑。首先,它会让你打包AssetBundle的速度变慢。然后,它是很笨的,只会认得当前模型上面赋的材质需要什么数据,而且是针对整个项目的。如果你的模型是需要到在游戏运行当中改变各种Shader效果的,那么,有可能因为这个选型,会导致你的数据丢失,让你想要的Shader得不到想要需要的网格模型数据,从而显示出错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值