Unity项目资源加载与管理
来源:互联网 发布:淘宝迷你变色龙活体 编辑:程序博客网 时间:2024/05/20 05:28
将材质打包为AssetBundle,运行时使用LoadAsset加载材质也成功了,为什么还会出现材质丢失呢?
那么现在我们知道,其实通过LoadAsset从被依赖资源的AssetBundle中加载出来的资源,除非我们手动绑定回主体资源中(例如把加载出来的材质通过代码绑定回GameObject的Renderer中),否则是不会被自动索引到的。
也就是说,通过AssetBundle来动态加载资源时,我们并不需要自己加载被依赖的资源,而是只要保证主体在加载时被依赖资源所在AssetBundle依然处于开启状态就可以正常加载资源了。
为什么游戏切换到后台一段时间后再切换回来材质会变成粉色呢?
这时,如果原来的Shader和Texture资源是从AssetBundle中加载出来的,并且该AssetBundle已经被卸载掉的话,那么Unity就无法再从内存中加载到这些资源,从而导致GPU丢失Shader与Texture了。
可能有朋友会说,这些Shader和Texture不是曾经被加载到内存中吗?是的,但是它们在被加载到GPU之后会被从内存中清除掉。因此要防止这种问题的发生最稳健的办法就是Shader和Texture的AssetBundle在场景切换前都不要卸载掉。而如果担心AssetBundle本身消耗内存问题的话可以参考下一个问题的解答。
新的ChunkBasedCompression压缩方式相比原来的压缩方式有什么区别呢,应该如何取舍呢?
而Unity5.3以后提供的ChunkBasedCompression是一种基于Chunk的LZ4压缩方式,这种压缩方式可以让AssetBundle对单独的Asset进行压缩,而不是AssetBundle整体压缩。因此加载这种压缩方式的AssetBundle时,无需事先解压,只需在内存中保留一个头结构,然后在加载某个Asset的时候才即时从文件中读取该Asset所在的chunk并解压到内存中。
由于LZ4是公认的解压速度极快的压缩方式,并且需要即时解压的数据量一般不会很大,因此实时解压Asset带来的CPU时间消耗其实很小,另一方面把解压时间分散在不同地方也减轻了一次性解压带来的卡顿问题。当然,最重要的优点还是在于大大减轻了内存的压力,可以放心地让有可能被再次索引的AssetBundle常驻在内存中,因此我们非常推荐大家使用LZ4压缩方式的AssetBundle。
不过大家在使用过LZ4压缩方式后应该也会发现,在资源数比较多的情况下,LZ4格式的AssetBundle大小基本都要比LZMA格式的大一些,这也是分块压缩不可避免的缺陷。但考虑到它的内存消耗表现优秀,移动端的开发朋友应该可以忽略这一点吧。
Resources文件夹里的资源越多,程序的启动画面时间就越长。这是为什么呢?
要理解这个问题,我们需要知道Unity程序启动时的一个操作。在启动加载的过程中,Unity需要为Resources文件夹(此时其实就是一个序列化文件)中的所有资源构建一个查找树作为后面加载具体Asset时所需的索引数据,而这个结构的构造时间是非线性的(比线性稍高一点),因此在Resources文件夹中的文件越多,启动加载的时间就越明显,基本10000个资源在一些低端手机上需要5到10秒的加载时间。另一方面,考虑到Resources文件夹无法动态更新,也没有AssetBundle Variant这种设定不同资源版本的功能,因此我们极力推荐大家主要采用AssetBundle进行资源的动态加载,而Resources文件夹的使用可以只考虑这几种情况:
这些资源在整个游戏的运行期间都会用到;
这些资源无需为不同平台或硬件适配定制资源;
这些资源无需动态更新;
正在制作游戏的原型。
程序中主要使用AssetBundle.Unload(false)卸载AssetBundle,有时会发现AssetBundle中的资源在内存中会存在多份,这是为什么呢?
这种问题产生的根源在于从AssetBundle中加载出来的资源,在该AssetBundle卸载之后与此AssetBundle的联系就断开了。举个例子,我从AssetBundle A 中加载出来一个Prefab p1, 那么p1本身依赖的资源,例如一个Texture tex1也会自动加载到内存中。然后我用AssetBundle.Unload(false)来卸载AssetBundle A,此时p1与AssetBundle A已断开关系。之后过了一段时间,我需要从AssetBundle A中加载另一个Prefab p2 ,假设p2也依赖于Texture tex1,那么我再次加载AssetBundle A,从中加载p2时tex1会再次被加载到内存中,导致此时内存中存在两份tex1。这个AssetBundle的资源索引策略我们官方在之后的版本中会进行修改以避免这种情况产生的内存消耗。而现阶段大家其实只要注意AssetBundle的卸载时机即可避免此情况的发生,即在保证当前场景中同一AssetBundle不会再被引用的时候卸载或者统一都在场景切换的时候使用Unload(true)进行卸载。
0 0
- Unity项目资源加载与管理
- Unity资源加载与释放
- Unity 项目管理与优化
- 游戏项目中的资源加载管理
- Unity 加载数据库资源
- Unity资源加载
- unity资源加载
- Unity3d 资源加载与内存管理
- Unity3D资源加载与内存管理
- Unity项目架构设计与开发管理
- 关于Unity资源的动态加载与WWW的使用
- Unity 3D 资源的加载与释放
- Unity 资源加载释放相关
- Unity动态加载远程资源
- unity动态加载远程资源
- unity动态加载远程资源
- Unity利用Resources加载资源
- Unity中的资源加载方法
- iOS配置HTTPS
- UnicodeEncodeError: 'ascii' codec can't encode characters in position问题
- C++调用IDL程序的做法(三)
- Python学习笔记 --- repr函数介绍
- HTML5
- Unity项目资源加载与管理
- Mybatis为实体类定义别名typeAliases
- Android常用之返回按键监听
- Foxit Mobile PDF SDK-强大的UI Extensions(如何实现PDF的填表,超链接,搜索,标注。。。)
- LeetCode 2016 45,57,414,413,289,106,105
- STM32学习9
- TexturePacker使用
- mysql5.6在windows下配置本地localhost的库名和表名大小写敏感
- ath9k usb wifi 网卡驱动浅析