Unity Notes之生成AssetBundle时的引用丢失问题以及其它
2015-02-14 19:37
489 查看
Unity中提供的AssetBundle是资源管理中很重要的一部分,可以用它来实现游戏发布后的各种资源动态更新功能。其中的生成参数常用的有两个BuildAssetBundleOptions.CollectDependencies,BuildAssetBundleOptions.CompleteAssets,两者的详细差异可以参加Unity的文档。
【AssetBundle中的引用丢失】其中的CollectDependencies会track当前资源所需要的全部依赖资源,并也会将其打入到对应的包中,比如对于一个prefab来说,其所使用的.fbx模型、贴图、动画文件以及Atlas等等都会进入到生成包中。而CompleteAssets则同样会track引用关系,但是却不会包入相应的资源。
一般情况下,为了减少包的大小可能中需要保留引用关系来生成资源包,这就需要使用CompleteAssets参数。但是对于prefab上包含的脚本和shader等则会在使用此参数打出的包中丢失依赖关系,会出现找不到对应的引用对象,这个查了下可能是目前Unity版本中的一个bug。一个可用的解决方法就是将此包打两遍:
第一次使用CollectDependencies生成中间包,然后将其PushAssetDependencies,作为第二次打包的依赖包。
然后再使用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的最大显示长度可以解决此问题。
【AssetBundle中的引用丢失】其中的CollectDependencies会track当前资源所需要的全部依赖资源,并也会将其打入到对应的包中,比如对于一个prefab来说,其所使用的.fbx模型、贴图、动画文件以及Atlas等等都会进入到生成包中。而CompleteAssets则同样会track引用关系,但是却不会包入相应的资源。
一般情况下,为了减少包的大小可能中需要保留引用关系来生成资源包,这就需要使用CompleteAssets参数。但是对于prefab上包含的脚本和shader等则会在使用此参数打出的包中丢失依赖关系,会出现找不到对应的引用对象,这个查了下可能是目前Unity版本中的一个bug。一个可用的解决方法就是将此包打两遍:
第一次使用CollectDependencies生成中间包,然后将其PushAssetDependencies,作为第二次打包的依赖包。
然后再使用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加载AssetBundle后shader丢失问题
- Unity Assetbundle shader(丢失)不正确显示的问题
- 关于unity 中使用AssetBundle加载资源,shader偶尔会丢失的问题解决办法
- Unity5 AssetBundle 打包以及加载
- Unity的资源加载以及AssetBundle的一些坑
- [置顶] [Unity]AssetBundle资源更新以及多线程下载
- Unity 5 的Assetbundle 以及unity 4的Assetbundle 食用方法
- Unity5 AssetBundle 打包以及加载
- 解决MVC中使用BundleConfig.RegisterBundles引用Css及js文件发布后丢失的问题
- unity5.5 解决打包图片到AssetBundle中尺寸变化问题
- unity AssetBundle打包以及加载
- Unity 通过 www 下载 assetbundle , 在 iOS9 设备无法下载的问题
- Unity5中Inspector界面上的AssetBundle值设定问题
- 解决MVC中使用BundleConfig.RegisterBundles引用Css及js文件发布后丢失的问题
- 解决打包AssetBundle时Shader(材质)丢失问题
- unity5.4版本打包AssetBundle与加载(避免材质丢失网格丢失)
- 解决MVC中使用BundleConfig.RegisterBundles引用Css及js文件发布后丢失的问题
- 关于AssetBundle,Shader丢失的问题
- unity 生成assetbundle文件
- unity5 assetbundle 发布资源平台的大坑。程序发布成exe后执行与编译器内不同的问题解决。