注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

重新出发的阿赵

阿赵的博客

 
 
 

日志

 
 

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

2017-10-17 23:05:44|  分类: Unity教程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
这次来说说LightMap和Fog导致FBX打包AssetBundle产生的容量问题。下面会做一些小测试,来看看有那些方面会影响FBX打包AssetBundle的容量。
首先我准备了一个普通的fbx网格模型:
解决LightMap和Fog导致FBX打包AssetBundle的容量增大的问题 - 阿赵 - 重新出发的阿赵
 然后给他设置了AssetBundleName
解决LightMap和Fog导致FBX打包AssetBundle的容量增大的问题 - 阿赵 - 重新出发的阿赵
正常打包成AssetBundle,可以看到容量是91k。
解决LightMap和Fog导致FBX打包AssetBundle的容量增大的问题 - 阿赵 - 重新出发的阿赵

也许很多人都知道,如果把一个场景打包成AssetBundle,需要在Graphics里面设置一下LightMapMode和FogMode,不然打包后的AssetBundle加载后是没有LightMap和雾的效果的。所以我这里也设置一下。
解决LightMap和Fog导致FBX打包AssetBundle的容量增大的问题 - 阿赵 - 重新出发的阿赵
打开Graphics设置面板,可以看到这两个设置的地方默认都是自动(automatic)的
解决LightMap和Fog导致FBX打包AssetBundle的容量增大的问题 - 阿赵 - 重新出发的阿赵
 下面改成手动,然后把勾全部勾上:
解决LightMap和Fog导致FBX打包AssetBundle的容量增大的问题 - 阿赵 - 重新出发的阿赵
再次打包,会看到AssetBundle容量变成了386k。
解决LightMap和Fog导致FBX打包AssetBundle的容量增大的问题 - 阿赵 - 重新出发的阿赵 
这是一个很奇怪的现象。按照Unity官方的说法,Shader stripping只是简化打包出去的AssetBundle的shader而已。如果你的项目的shader是单独打包成依赖的,如果设置了手动的这两个模式,实际上打包出去的Shader也的确变大了很多的。但实际上,现在影响到了FBX的容量。
 
所以接下来,把一些我觉得用不到的选项去掉,变成下图这样。
解决LightMap和Fog导致FBX打包AssetBundle的容量增大的问题 - 阿赵 - 重新出发的阿赵
忘记截图了,这次打包出来的容量是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
解决LightMap和Fog导致FBX打包AssetBundle的容量增大的问题 - 阿赵 - 重新出发的阿赵

然后设置prefab的AssetBundleName:
解决LightMap和Fog导致FBX打包AssetBundle的容量增大的问题 - 阿赵 - 重新出发的阿赵
 
打包出来:
解决LightMap和Fog导致FBX打包AssetBundle的容量增大的问题 - 阿赵 - 重新出发的阿赵
 看到结果,fbx仍然是91k,prefab出来的容量是67k,两者加起来就是158k。

接下来,把fbx的AssetBundleName去掉,然后打包: 
解决LightMap和Fog导致FBX打包AssetBundle的容量增大的问题 - 阿赵 - 重新出发的阿赵
 
这次看到的结果是,只有prefab被打包成AssetBundle,容量是91k
解决LightMap和Fog导致FBX打包AssetBundle的容量增大的问题 - 阿赵 - 重新出发的阿赵
这说明了,实际上就算把预设依赖的fbx打包AssetBundle,实际上还是产生了冗余。所以,最好的做法,是不要直接使用fbx,所有的fbx都先做成预设,然后再用。然后打包依赖时,打包到prefab这一层就够了。

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

 

 
 
  评论这张
 
阅读(76)| 评论(4)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017