Unity Notes之生成AssetBundle时的引用丢失问题以及其它

Unity中提供的AssetBundle是资源管理中很重要的一部分,可以用它来实现游戏发布后的各种资源动态更新功能。其中的生成参数常用的有两个BuildAssetBundleOptions.CollectDependencies,BuildAssetBundleOptions.CompleteAssets,两者的详细差异可以参加Unity的文档。

【AssetBundle中的引用丢失】其中的CollectDependencies会track当前资源所需要的全部依赖资源,并也会将其打入到对应的包中,比如对于一个prefab来说,其所使用的.fbx模型、贴图、动画文件以及Atlas等等都会进入到生成包中。而CompleteAssets则同样会track引用关系,但是却不会包入相应的资源。

一般情况下,为了减少包的大小可能中需要保留引用关系来生成资源包,这就需要使用CompleteAssets参数。但是对于prefab上包含的脚本和shader等则会在使用此参数打出的包中丢失依赖关系,会出现找不到对应的引用对象,这个查了下可能是目前Unity版本中的一个bug。一个可用的解决方法就是将此包打两遍:

  1. 第一次使用CollectDependencies生成中间包,然后将其PushAssetDependencies,作为第二次打包的依赖包。
  2. 然后再使用CompleteAssets进行最终的打包,这样该包中的所有依赖关系都从第一个完整包中继承过来,也就不会出现引用丢失的情况了。

【AssetBundle的自动化生成】另外,某些情况下可能有会将AssetBundle的生成与打包嵌入到项目已有的自动化差异更新工具链中。这时就可能需要一个不加手动操作的AssetBundle生成方式,可以使用Command line的方式来启动Unity并执行相关的操作,http://docs.unity3d.com/Manual/CommandLineArguments.html。比如

"C://Program Files/Unity/Unity.exe -batchmode -openProject "D://TestProject" -executeMethod someStaticMethod -logfile temp/log.txt -quit"

就可以在命令行中启动Unity打开相关的项目工程,并做相关的操作后自动退出。

【NGUI3.0中的bug】另另外,最近在调试上线项目时遇到了NGUI中的一个问题。在NGUI3.0的UILabel里边使用了动态的字体,这个字体会创建FontMaterial。这个FontMaterial的大小会根据要显示的内容来进行动态的扩充(目前的NGUI问题版本只是进行了扩充),这样的话在某一次显示了较多的文字内容之后这个FontMaterial就会变得比较大;而这个大小尺寸是会被之后的其它所有Label渲染时共用的,之后创建的大小都是这么大。再加上NGUI对FontMaterial的管理采用了Cache机制,它会使得使用之后的FontMaterial并不会被立即释放掉。所以就会出现在某一次使用一个Label渲染了较多的内容,导致FontMaterial的尺寸被扩得过大,之后再使用UILabel进行渲染时就会使得内存占用变得越来越大,进而就会很卡。而FontMaterial的尺寸扩充又是2^n方式(32,128,512,1024,2048,32768,对应的大小可能就是直接从0.6KB增加到1.6MB),所以就会出现在字数超过某个值之后FontMaterial直接变到了下一个级别的大小,进而就会导致后续的内存不足以致于卡爆。升级NGUI至最新版本或手动控制UILabel的最大显示长度可以解决此问题。

你可能感兴趣的:(Unity,3D)