求助,buildassetbundles使用后,手机发热量增加

【智商捉急】请问开发过程中哪些情况需要使用AssetBundle【unity3d吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:78,187贴子:
【智商捉急】请问开发过程中哪些情况需要使用AssetBundle收藏
说来惭愧,入门这么久了,学到的东西并不是所有都用到过, 比如这个AssetBundle, 怎么用当然大家都懂.但我从没在实战中用过这个概念.这里想请问一下究竟哪些情况会用到AssetBundle.除了手机网游在更新的时候需要用到, 其他还会有需要用到的情况吗? 新手不懂.
51CTO学院11年行业品牌,1400万用户选择,中国专业IT技能学习平台,unity 3d.通过在线学习的方式,帮助广大技术人员实现技能提升,高薪就业的职业梦想,unity 3d.
听说pro版才有,我没接触过。不过 根据猜测我 想能够做一种 东西:1、客户端 当运行,
请求PHP服务器端遍历某个文件夹或者数据库,返回有多少资源。
当客户端接收到反馈、 根据资源的多少、 实例化多少个Button。
Button携带点击事件之加载网络模型。
就相当于服务器里放了很多 资源、相当于一种优化、
当 客户端请求的时候, 就加载、 否则就不加载。 不然的话 打包出来的程序很大很大。我猜的、虽然很想接触,但是占时没有那个机会。
如果等我把场景打包弄玩 每次更新只要更新一个apk了
苍霞么么哒
我只在换装的时候用过 哈哈哈
项目过大发布出来是运行不了的。这时候必须外部加载。手游方面就是做热更新用的。
我现在pc端就在用这个,挺方便
什么鬼[FACE WITH TEARS OF JOY]
游戏的话基本就更新用,但其他的东西会经常用到
举个例子吧,一般的话都是用于加载资源的时候用的。namespace app\use yii\web\AssetBclass AppAsset extends AssetBundle {
public $basePath = '@webroot';
public $baseUrl = '@web';
public $css = [
'public/skin/default_skin/css/theme.css',
public $js = [
'public/vendor/jquery/jquery-1.11.1.min.js',
'public/vendor/jquery/jquery_ui/jquery-ui.min.js',
'public/js/bootstrap/bootstrap.min.js',
public $depends = [
//这里写你的依赖包即可,没有就别写
//导入当前页的功能js文件,注意加载顺序,这个应该最后调用
public static function addPageScript($view, $jsfile) {
$view-&registerJsFile($jsfile, [AppAsset::className(), 'depends' =& 'app\assets\AppAsset']);
//导入编辑器
public static function addCkeditor($view) {
$view-&registerJsFile('/public/js/utility/ckeditor/ckeditor.js', [AppAsset::className(), 'depends' =& 'app\assets\AppAsset']);
}可以看到上面我创建的类中已经预定义了两个静态方法addPageScript和addCkeditor,其中addCkeditor是一个第三方的js组件,是个编辑器,具体的开发环境中你们可以写别的方法名及加载别的组件。我们在模板页开头部分加上这句话://自动加载资源AppAsset::register($this);这样会在模板页加载基础的项目资源文件,比如css和js什么的。//导入ckeditor包资源\app\assets\AppAsset::addPageScript($this,'js文件相对路径或url');这样做的好处是,即使在视图里加载css或js也会因为依赖关系而出现在视图外面的常规加载区域中,规范了很多。同时也因为依赖关系,你在视图里加载的文件肯定会排在你的基础样式或脚本的后面,不会出错。在Unity3d中的话也是大同小异,根据自己的打包方式来进行解包,实现动态的加载。
登录百度帐号推荐应用转自/college/articledetail/7151362
使用Assetbundle需要考虑的问题
Assetbundle资源打包时需要考虑如下几个问题:
1.如何有效地将依赖资源完整打包?如何减少资源重复打包,同时保证加载时不会导致内存超标?
2.如果多个资源打包在一个Assetbundle中,如何通过指定资源名查找定位到对应Assetbundle包名并加载?
3.创建多份相同资源(如副本中刷出多个相同的怪)GameObject时,想做到只加载一次Assetbundle和Prefab,提升加载效率,降低内存,如何设计缓存机制?
4.Assetbundle用完后如何释放?会不会有内存泄漏发生?如何避免?
资源依赖关系及打包规划
在Unity中一个Prefab文件可能会对另外的资源文件(如Prefab,贴图,shader等)有依赖,Unity提供了如下方式处理资源加载的依赖关系。
打包方法BuildPipeline.BuildAssetBundle(Object mainAsset, Object[] assets, string pathname, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform)
中参数assetBundleOptions使用BuildAssetBundleOptions.CollectDependencies | pleteAssets会将对象依赖的资源自动整体打入一个Assetbundle包中,这样保证了资源加载的完整性。
接着考虑到如果在打包时,将资源单独打包,那么多个资源所共用的资源就会被打包成多分,造成了冗余;如果将资源整体打成一个包,那么加载一个资源就需要加载整个Assetbundle包的镜像到内存,造成内存压力过大,对于资源量较大的游戏甚至发生游戏崩溃的情况。Unity提供方法
BuildPipeline.PushAssetDependencies()
BuildPipeline.PopAssetDependencies()
建立资源依赖关系,可以有效减小资源打包冗余。比如当打包shared, A, B三个资源时,伪代码如下:
BuildPipeline.PushAssetDependencies();
BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath(&shared.prefab&), &);
BuildPipeline.PushAssetDependencies();
BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath(&A.prefab&), &);
BuildPipeline.PopAssetDependencies();
BuildPipeline.PushAssetDependencies();
BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath(&B.prefab&), &);
BuildPipeline.PopAssetDependencies();
BuildPipeline.PopAssetDependencies();
如果shared包含了A的资源,A就不会包含这个资源,而是依赖于shared中的;如果shared包含了B的资源,B也是依赖于shared中的;但是如果A包含了B的资源,B则不会依赖于A中的,而是自己包含这个资源。也就是说,在Push和Pop对中的资源可共享浅层级的资源,而无法共享层级更深的资源。
另外,在加载A资源之前,需要先加载shared资源,否则会出现A资源依赖的资源丢失问题。这个就要求开发者自己保证资源的加载顺序。对于资源量较大的实际工程,应当适度使用资源依赖,尽量避免资源加载时对加载顺序的限制,减小资源加载的复杂度,否则资源量大了之后较难管理维护。这里提供一些实际项目中的打包经验以供参考。
比如自定义的所有shader文件可以提取出来打包为公共Assetbundle包,避免出现每个依赖shader的资源都会单独打包shader,而造成冗余打包的情况。由于打包主要是为了支持资源级别的热更新,而shader一般情况下是不太可能被修改的,如果确定资源级别热更新不太可能更新shader,甚至可以将自定义shader文件放在Resources目录下不打Assetbundle包。
下来考虑模型资源,一般模型资源中最占空间的是材质贴图资源,可以要求美术将使用相同材质贴图的模型放在同一文件夹下,按照文件夹粒度打包,这样会有效地减小材质贴图重复打包造成的资源空间占用增长情况。
对于场景资源的加载一般也可按照场景的相似度,将共用大量物件贴图的场景放在一个文件夹中,将其打在一个Assetbundle包中,来减小场景资源空间增长的情况。
总之,在打包特定类型资源时需要按照这类资源依赖关系的特点,同时考虑减小Assetbundle包的粒度和减小依赖资源重复打包两方面使用Untiy提供的打包机制进行合理打包优化,达到加载到内存和资源包两方面冗余都能够满足游戏空间优化要求的目的。
Assetbundle资源命名管理
Unity在打包Assetbundle时没有提供现成的资源名到Assetbundle名映射关系。另外,Unity对于Assetbundle命名的要求是全局唯一。对于单个资源打包生成单个Assetbundle这种一对一的情况。可将Assetbundle名称命名为目录+文件名,以便于索引,这种情况一般用于本地数据表打包。但是对于资源共用比较多的场景和模型,一般会将多个贴图复用度较高的资源打包在一起,这就需要在创建Assetbundle包时建立资源文件名和Assetbundle包名的映射关系,将其序列化写入&xml文件中。游戏启动后先加载初始化资源映射关系表,以便于加载资源时通过资源名查找对应的Assetbundle包。
资源加载缓存机制
一份Assetbundle资源从加载到转化为GameObject需要经过如下三步:
(1)从网络或本地磁盘加载到内存生成Assetbundle文件内存镜像(异步);
(2)Assetbundle.Load接口加载内存镜像生成内存Prefab(阻塞式);
(3)Prefab被初始化复制生成GameObject(阻塞式);
如下图所示:
在移动平台下从网络或本地磁盘加载指定AssetBundle包到内存可以使用Unity提供的如下两个接口:
(1)&&&&&&&WWW bundle = new WWW(path);
(2)&&&&&&&WWW bundle = WWW.LoadFromCacheOrDownload(path, fileVer);
方法WWW.LoadFromCacheOrDownload会通过传入的下载地址和版本号在内存中查找是否已经有缓存的Assetbundle镜像,如果有,直接返回镜像;没有就会下载并缓存新的Assetbundle镜像。这里需要注意的是,传入的下载地址即使相同,版本号不同也会重新下载,对于没有加载多份相同镜像需求的常规情况,只需要将版本号参数设置为1&就好了。另外,缓存的释放机制由Unity自行管理,不需要使用者考虑,在磁盘空间不足的极端情况下,这个方法只是一个普通的new WWW。这是从Unity引擎层面保证相同的Assetbundle镜像在内存中只有一份,防止内存加载冗余。在实际项目中,开发者还需要自行管理加载缓存机制,不能只依赖于Unity的机制。在这里提供一种加载缓存的方法供大家参考讨论。
由上图可以看出Assetbundle加载后在内存里有Assetbundle镜像,未初始化的Prefab和初始化后复制的GameObject,设计缓存机制时需要从这三处考虑。缓存未初始化的Prefab既可以省略异步加载Assetbundle镜像的过程,又可以得到未修改的GameObject。因此首先定义一个以资源ID为Key值的Prefab字典。
Dictionary&string, GameObject&&&& mPrefabM
接着考虑加载一波相同怪物的情况。由于Assetbundle内存镜像的加载是异步的,因此无法按逻辑顺序判断避免重复加载Assetbundle。这里需要再定义一个以Assetbundle文件名为Key值的Assetbundle内存镜像字典。
Dictionary&string, Assetbundle&&&&& mAssetM
相同资源再次加载时如果发现Assetbundle镜像正在加载中,缓存起来等待镜像加载完成处理。缓存结构如下:
Dictionary&string,List&ABLoader&& mLoadersM
这里Key为Assetbundle文件名,Value为待处理的加载器列表。
加载流程如下图所示:
在初始化GameObject后会立刻释放Assetbundle镜像和对应待加载的ABLoader对象列表。这种机制可以保证加载多份相同资源时只异步加载一次Assetbundle镜像(较为耗时),并且在内存中只缓存一份Prefab,再次加载相同资源时只需通过Prefab复制初始化即可。另外Prefab的释放时机可以选择一波怪GameObject销毁时,也可以选择关卡结束时,这个按照项目具体情况选择即可。
Assetbundle使用时需要注意的坑
Assetbundle在实际使用时遇到了很多的问题。这里总结一些典型的问题供大家参考,避免再次掉进坑里。
在打包Assetbundle时需要注意两个坑。一个是不做资源依赖打包的情况下不要添加Push和Pop对,否则会在部分机型(如华为P8)下出现加载资源积累到一定程度时(如加载几十波怪)出现资源贴图丢失的问题。另一个需要注意的是做资源依赖打包下面的写法是错误的。
BuildPipeline.PushAssetDependencies();
BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath(&shared.prefab&), &);
BuildPipeline.PushAssetDependencies();
BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath(&A.prefab&), &);
BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath(&B.prefab&), &);
BuildPipeline.PopAssetDependencies();
BuildPipeline.PopAssetDependencies();
这样有可能会导致加载资源出现贴图丢失的情况。正确的写法如下:
BuildPipeline.PushAssetDependencies();
BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath(&shared.prefab&), &);
BuildPipeline.PushAssetDependencies();
BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath(&A.prefab&), &);
BuildPipeline.PopAssetDependencies();
BuildPipeline.PushAssetDependencies();
BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath(&B.prefab&), &);
BuildPipeline.PopAssetDependencies();
&&&&&&&& &
BuildPipeline.PopAssetDependencies();
每个依赖于Shared的资源打包时都需要用添加单独的Push和Pop对。
如果对自定义的Shader单独打Assetbundle包,需要在Edit-&Project Settings-&Graphics中添加自定义的shader引用,否则加载会出现Shader丢失的情况。
实际工程中为了减小DLL空间大小,通常会打开Stripping Level设置,剥离没有被使用的库。这样会出现以下情况,当模型骨骼都被做成Assetbundle包,并且模型使用了物理关节后加载模型崩溃,当场景被做成Assetbundle包,并且场景中使用了LightProbe,加载场景后,LightProbe影响的材质都会变黑。这些都是因为对应的物理库和LightProbe库没有被打包到安装包中,出现这种问题时可以在Assets目录下添加link.xml文件来手动加入需要引用的库。
另外,外网有部分玩家反馈,打了一段时间后无法进入场景。定位发现部分手机大文件清理会清除大于10M的文件,单个Assetbundle包大小不要超过10M。
以上是使用Assetbundle打包和加载资源的一些经验和心得,有需要改进的地方欢迎指正探讨。
阅读(...) 评论()Unity3d资源解决方案之AssetBundle
Unity3d资源解决方案之AssetBundle
1、什么是AssetBundleAssetBundle是Unitypro提供的一种用来存储资源的文件格式,它可以存储任意一种Unity引擎能够识别的资源,如Scene、Mesh、Material、Texture、Audio、noxss等等,同时,AssetBundle也可以包含开发者自定义的二进制文件,只需要将自定义文件的扩展名改为.bytes,Unity就可以把它识别为TextAsset,进而就可以被打包到AssetBundle中。Unity引擎所能识别的资源我们称为Asset,AssetBundle就是Asset的一个集合。AssetBundle的特点:压缩(缺省)、动态载入、本地缓存;2、AssetBundle VS ResourceAssetBundle作为Unity官方推崇的资源更新方案,与传统的Resource差异如下:a、Resource放在Resources目录下,resources.assets文件,单个文件有2GB限制,首次必须全部下载;b、AssetBundle创建需要通过Editor脚本创建,支持动态下载,是Unity Web Caching License唯一可以缓存的内容;3、AssetBundle的适用平台与跨平台性AssetBundle适用于多种平台,包括网页应用、移动应用、桌面应用等,可以动态更新,但不同平台所使用的AssetBundle并不相同,在创建离线AssetBundle的时候需要通过参数来指定目标平台,相容关系如表所示:4、AssetBundle的工作流程(与flash加载swf类似)a、创建AssetBundle;b、上传到Server;c、游戏运行时根据需要下载(或者从本地cache中加载)AssetBundle文件;d、解析加载Assets;e、使用完毕后释放;5、创建AssetBundle5.1、如何创建AssetBundleUnity引擎提供了创建AssetBundle的API,通过编译管线BuildPipeline来创建AssetBundle文件,总共有三种方法:a、BuildPipeline.BuildAssetBundle(mainAsset : Object, assets : Object[],pathName : string, options : BuildAssetBundleOptions =BuildAssetBundleOptions.CollectDependencies |<pleteAssets, targetPlatform : BuildTarget =BuildTarget.WebPlayer) : bool该API将编辑器中的任意类型的Assets打包成一个AssetBundle,适用于对单个大规模场景的细分;b、BuildPipeline.BuildStreamedSceneAssetBundle(level : string[], locationPath : string, target : BuildTarget) : String该API将一个或多个场景中的资源及其所有依赖以流加载的方式打包成AssetBundle,一般适用于多单个或多个场景进行集中打包;c、BuildPipeline.BuildAssetBundleExplicitAssetNames(assets : Object[],assetNames : string[],pathName : string, options :BuildAssetBundleOptions = BuildAssetBundleOptions.CollectDependencies |<pleteAssets, targetPlatform : BuildTarget =BuildTarget.WebPlayer) : bool该API功能与a相同,但创建的时候可以为每个Object指定一个自定义的名字。(一般不太常用)5.2、关于BuildAssetBundleOptionsa、CompleteAssets使每个Asset自身完备,包含所有的Components;b、CollectDependencies包含每个Asset依赖的所有其他Asset;c、DisableWriteTypeTree在AssetBundle中不包含类型信息。需要注意的是,如果将AssetBundle发布到web平台上,则不能使用这个选项;d、DeterministricAssetBundle使每个Object具有唯一的、不变的HashID,便于后续查找可以用于增量发布AssetBundle;e、UncompressedAssetBundle不进行数据压缩。如果使用这个选项,因为没有压缩/解压的过程,AssetBundle发布和加载会更快,但是AssetBundle也会更大,导致下载变慢。5.3、AssetBundle之间的依赖如果游戏中的某个资源被多个资源引用(例如游戏中的Material),单独创建AssetBundle会使多个AssetBundle都包含被引用的资源(这里跟flash编译选项中的链接选项有些像),从而导致资源变大,这里可以通过指定AssetBundle之间的依赖关系来减少最终AssetBundle文件的大小(把AssetBundle解耦)。具体方法是在创建AssetBundle之前调用BuildPipeline.PushAssetDependencies和BuildPipeline.PopAssetDependencies来创建AssetBundle之间的依赖关系,它的用法就是一个栈,后压入栈中的元素依赖栈内的元素。(记得要pop!)举个例子:现在游戏内有mat1和mat2两个Material,他们使用了相同的Texture zhuanqiang不使用依赖使用依赖6、远端Server的AssetBundle下载Unity引擎提供了两种方式从服务器下载AssetBundle文件,分别是缓存机制和非缓存机制。6.1、缓存机制通过WWW.LoadFromCacheOrDownload (url : string, version : int)接口来下载AssetBundle,下载后的AssetBundle会自动被保存到Unity引擎的缓存区内,该方法是Unity推荐的AssetBundle下载方式。下载AssetBundle的时候,该接口会先在本地缓存中查找该文件,看其之前是否被下载过,如果下载过,则直接从缓存中加载,如果没有,则从服务器尽享下载。这样做的好处是可以节省AssetBundle文件的下载时间,从而提高游戏资源的载入速度(还可以节省下载流量)。同时开启多个Coroutine进行WWW的LoadFromCacheOrDownload操作(缓存中),经测试开启的WWW现成越多,速度会越快,但是需要考虑时机的机器火平台的承载能力。如果一定要从网上下载资源的话,线程数最好设为5个(别人的经验),很多平台也有自己的限制,例如有的浏览器只能同事加载6个等等。需要注意的是,Unity提供的默认缓存大小是根据发布平台不同而不同的(可以向Unity购买Caching license支持)。目前对于web player的网页游戏,默认缓存大小为50M;对于PC上的客户端或者?上的移动游戏,默认缓存大小为4GB。代码:WWW www = WWW.LoadFromCacheOrDownload (Url, 1);AssetBundle ab = www.assetB6.2、非缓存机制通过创建一个WWW实例来对AssetBundle文件下载,下载后的AssetBundle文件将不会进入Unity的缓存区。使用这种方法每次都会从远端服务器下载。代码:WWW www = new WWW(Url);AssetBundle ab =www.assetB7、载入AssetBundle对象7.1、通过WWW类方法和属性直接通过WWW.assetBundle属性来创建AssetBundle,注意:通过WWW加载的AssetBundle在解析Asset之前一定要先调用WWW.assetB7.2、通过API动态创建AssetBundle.CreateFromFile接口从磁盘创建一个AssetBundle文件的内存对象,该方法仅支持非压缩格式的AssetBundle。7.3通过API动态创建AssetBundle.CreateFromMemory接口可以从内存数据流创建一个AssetBundle内存对象。主要用于对数据的加解密上。例如:WWW www = new WWW(url);byte[] encrypedData =www.byte[] decryptedData = YourDecryptionMethod(encrypedData);//解密函数AssetBundle ab = AssetBundle.CreateFromMemory(decrypedData);8、从AssetBundle中加载Assets8.1、Assets的加载AssetBundle.Load (name : string) : Object 从bundle中加载名为name的对象;AssetBundle.Load (name : string, type : Type) : Object 从bundle中加载被指定类型的名为name的对象;AssetBundle.LoadAsync (name : string, type : Type) : AssetBundleRequest 异步地从bundle中加载被指定类型的名为name的对象(异步加载需要Unity Pro专业版);AssetBundle.LoadAll (type : Type) : Object[] 加载所有包含在asset bundle中且继承自type的对象;AssetBundle.LoadAll () : Object[] 加载所有包含在asset bundle中的对象;AssetBundle.mainAsset主资源在构建资源boundle时指定(只读),该功能可以方便的找到bundle内的主资源。例如,你也许想有一个角色的预制体并包括所有纹理、材质、网格和动画文件。但是完全操纵角色的预设体应该是你的mainAsset并且易于被访问;例如://开始下载WWW www = new WWW(url);//等待下载完成//获取指定的主资源并实例化Instantiate();8.2、AssetBundle中加载LevelApplication.LoadLevel 该接口可以通过名字或者索引载入AssetBundle文件中包含的对应场景,当夹在新场景时,所有之前加载的GameObject都会被销毁;Application.LoadLevelAsync 该接口的作用与Application.LoadLevel相同,不同的是该接口是异步加载,即加载时主线程可以继续执行;Application.LoadLevelAdditive 该接口不同与Application.LoadLevel的是并不销毁之前加载的GameObject;Application.LoadLevelAdditiveAsync 该接口的作用与Application.LoadLevelAdditive相同,不同的是该接口是异步加载,即加载时主线程可以继续执行;例如:WWW www = new WWW(url);AssetBundle ab =www.assetBApplication.loadLevel("Level1");9、AssetBundle与内存内存一直都是开发者关注的一个重点,如果要了解清楚内存的使用情况。9.1、加载AssetBundle对内存的影响Unity引擎在使用WWW方法时会分配一系列的内存空间来存放WWW实例对象、WebStream数据。该数据包括原始的AssetBundle数据、解压后的AssetBundle数据以及一个用于解压的Decompression Buffer。一般情况下,DecompressionBuffer会在原始的AssetBundle解压完成后自动销毁,但需要注意的是,Unity会自动保留一个DecompressionBuffer,不被系统回收,这样做的好处是不用过于频繁的开辟和销毁解压Buffer,从而在一定程度上降低CPU的消耗。当把AssetBundle解压到内存后,开发者可以使用WWW.assetBundle属性来获取AssetBundle对象,从而可以得到各种Assets,进而对这些Assets进行加载或者实例化操作。加载过程中,Unity会将AssetBundle中的数据流转变为引擎可以识别的信息类型(纹理、材质、对象等)。加载完成后,开发者可以对其进行进一步的操作,比如对象的实例化、纹理和材质的复制和替换等。9.2、AssetBundle的卸载1)AssetBundle.Unload(true) 该接口会强制卸载掉所有AssetBundle中加载的Asset,包括AssetBundle的映射结构、自身对Web Stream的引用以及从AssetBundle创建出来的所有资源,该接口不推荐使用。2)AssetBundle.Unload(false) 该接口会释放AssetBundle内的序列化数据,但是任何从这个AssetBundle中实例化的物体都将完好。当然,你不能从这个AssetBundle中加载更多物体。Resources.UnloadUnusedAssets该接口会卸载掉没有使用的Assets,作用范围是整个系统。3)对于实例化出来的GameObject,可以调用GameObject.Destory()接口来卸载。该接口会延后到一个合理的时机进行处理。注意:这是没有处理好的一个环节。在WWW加载资源完毕后,对资源进行instantiate后,对其资源进行unload,这时问题就发生了,instantiate处理渲染需要一定的时间,虽然很短,但也是需要1,2帧的时间。此时进行unload会对资源渲染造成影响,以至于没有贴图或 者等等问题发生。解决办法:自己写个时间等待代码,等待个0.5秒到1秒之后再进行Unload。这样就不会出现instantiate渲染中就运行unload的情况了。10、关于其他10.1、在AssetBundle中嵌入脚本AssetBundle中的资源上如果Attach了脚本,打包的时候该脚本是不会被打到AssetBundle中的,其实这里只是保存了一个类似于指针的关联,如果需要把脚本也动态打到AssetBundle中,还需要做一番工作。首先,将脚本预先编译成assembly,把assembly保存成.bytes文件,这样Unity会把它识别为TextAsset,就可以将这个TextAsset打包到AssetBundle中了,载入后可以通过反射机制使用该脚本,代码如下:AssetBundle bundle = WWWW.assetBTextAsset txt = bundle.load("MyBinaryAsText", typeof(TextAsset)) as TextAbyte[] bytes = txt.var assembly = System.Reflection.Assembly.Load(bytes);需要注意的是,IOS平台不支持动态载入脚本。10.2、AssetBundle的版本控制AssetBundle使用WWW.LoadFromCacheOrDownload(string url, int version, uintcrc)加载,其中的第二个参数-version可以用来做版本控制,该参数强制用户从服务器下载一个更高版本的AssetBundle。我们可以通过第三个参数crc来实现AssetBundle的内容校验,当crc不为0的时候,Unity会校验AssetBundle的CRC码,如果不等,则说明文件损坏,Unity会重新下载该文件。对于crc的获取,(老版本没有提供方法,只能通过LoadFromCacheOrDownload传一个错误的crc,从log中获取),新版本在BuildAssetBundle的时候增加了一个out类型的参数,该参数会返回正确的crc码,打包的时候可以记录下来以供后面使用。10.3、关于Editor和Runtime之间共享资源1)Unity提供了一种可以公用的类——noxssableObject,适用于描述动态划分场景;通过代码划分场景——&打包多个AssetBundle——&将划分信息记录在ScriptableObject中,并保存至Asset——&载入时先载入划分信息,再根据这个划分信息载入AssetBundle。2)使用XML文件。10.4、关于编辑器扩展可以通过事件触发来执行你的编辑器代码,但是我们需要一些编译器参数来告知编译器何时需要触发该段代码。 [MenuItem(XXX)]声明在一个函数上方,告知编译器给Unity3D编辑器添加一个菜单项,并且当点击该菜单项的时候调用该函数。触发函数里可以编写任何合法的代码,可以是一个资源批处理程序,也可以弹出一个编辑器窗口。代码里可以访问到当前选中的内容(通过Selection类),并据此来确定显示视图。与此类似,[ContextMenu("XXX")]可以向你的上下文菜单中添加一个菜单项。 当你编写了一些Component脚本,当它被附属到某个GameObject时,想在编辑视图即可在Scene视图观察到效果,那么你可以把[ExecuteInEditMode]写在类上方来通知编译器,该类的OnGUI和Update等函数在编辑模式也也会被调用。我们还可以使用[AddComponentMenu("XXX/XXX")]来把该脚本关联到Component菜单中,点击相应菜单项即可为GameObject添加该Component脚本。为了避免不必要的包含,Unity3D的运行时和编辑器类分辨存储在不同的Assemblies里(UnityEngine和UnityEditor)。Editor目录下的脚本会在其它脚本之后进行编译,这方便了你去使用那些运行时的内容。而那些目录下的脚本是不能访问到Editor目录下的内容的。所以,你最好把你的编辑器脚本写在Editor目录下。10.5、关于差量发布在5.2中介绍了创建AssetBundle的参数,其中的d选项在选中的时候可以使相同的内容两次发布出来的文件是完全一样的,我们在创建AssetBundle的时候选择上这个参数,那么就可以做差量了。测试数据如下:没有选择该参数:选择了该参数后:10.6、关于项目中应用项目中使用AssetBundle做开发可以使用宏进行隔离,接口封装尽量采用异步接口,通过引用计数cache机制,确定ab的释放时机。大体流程如下:a、确定加载ab次数(资源数)b、加载abc、成功后根据资源url引用计数减去对应资源数d、引用计数为0的时候调用AssetBundle的Unload(false)代码中使用的地方可以通过封装的GetObject获取已经加载的对象,使用完成后可以调用Resources的UnloadUnUsedAssets释放资源。10.7、关于AssetBundle的粒度控制AB的粒度越小,差量更新的冗余就会越小,粒度越大,差量更新的冗余就会越大。但是,并不是说粒度越小就越好,粒度小了,(运行时)加载的时候会增加IO次数、解压次数(AB一般选择压缩格式)和申请内存的次数,导致加载时长变长。因此粒度的控制是一个时间与空间平衡的选择过程。经过实验,大体有一个数据可以用来参考,1M左右的AssetBundle包加载性能最好,冗余也可以接受。10.8、关于AssetBundle的压缩选择AssetBundle压缩与不压缩的差异主要有两方面:a、外存(安装包的大小或者安装后占用磁盘空间的大小)b、加载方式的选择(能否使用同步方法)这里如果一些对性能要求特别高,资源又不大的AB可以采用非压缩方式,通过CreateFromFile加载AB包,性能最高又不会产生大量的内存。对于其他的资源文件,建议压缩处理,压缩与非压缩在磁盘占用上会有4倍左右的大小差别,如果都采用非压缩格式,有可能会导致你的磁盘占用达到一个非常恐怖的量级。10.9、AssetBundle在外存优化中的应用安装后的磁盘构成基本上是资源的内存值(Resources目录下资源),举个粒子,一张真彩色的的图片放到Resources目录下安装后占用的内存为4M(4*)。如果你的游戏是一个2D的,又包含很多的图片资源,这样会使你的安装包在用户机器上安装需要大量的磁盘空间,这里你可以把它们打成AB包放到用户的手机上,这样就磁盘占用就会小很多了。
狗狗,被黑了}

我要回帖

更多关于 unity5 assetbundle 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信