Unity 收藏本版 已有9人收藏 +发表新主题
查看: 34039|回复: 4
打印 上一主题 下一主题

[分享] Unity资源加载及资源更新

[复制链接]

[分享] Unity资源加载及资源更新

夏沫秋茶 发表于 2016-6-24 11:03:29 浏览:  34039 回复:  4 只看该作者 复制链接
Unity资源加载及资源更新
Unity的加载方式:1.Resources.Load (同步)                             
                              2.AssetBundle.LoadAsset(同步)
                              3.AssetBundle.LoadAssetAsync(异步)
下面我来分别介绍下这几种加载方式:
一:  Resources.Load
         Unity提供的一个加载接口,可以加unity支持的所有资源。需要将资源放到Resources路径下。
优点:简单,加载速度快 缺点:不支持动态更新,第一次需要将资源全部打到包内
二:AssetBundle.LoadAsset
        它是AssetBundle的一种同步加载方式,AssetBundle不可压缩,需将AssetBundle放到可读写路径(Application.persistentDataPath),StreamingAssets路径是读不到的(安卓可定不行,IOS待测),加载时需要将所有的依赖资源先加载出来,AssetBundle需要自己写工具来打包(请参考:Unity5的AssetBundle的一点使用心得
优点:可动态更新 缺点:需要自己打包处理复杂依赖关系,需要将资源下载到可读写路径,需要自己处理加载逻辑,加载速度比Resources稍慢,内存比Resources占用大(也需要看自己的处理方式)
三:AssetBundle.LoadAssetAsync
它是AssetBundle的一种异步加载方式,AssetBundle是否压缩无要求,可从StreamingAssets路径加载,Unity5后提供了关于AssetBundle加载的Demo(New AssetBundle build system in Unity 5.0),打包(请参考:Unity5的AssetBundle的一点使用心得
优点:AssetBundle打包可压缩,可从StreamingAssets路径加载,  缺点:加载速度比前两种都慢,内存也比前两种占的多


加载方式 是否支持更新 第一次启动要解压 加载速度 内存占用 复杂度 包资源大小
  Resources.Load  否  否  最快  最小  最简单  资源必须全部打进包内
  AssetBundle同步  是  是  较快  较少  较简单  可自行分配
  AssetBundle异步  是  否  较慢  较大  复杂  可自行分配




心得:这三种加载方式各有差异,通过两个实际项目我来简单说下我对这三种加载方式是怎么取舍的,
          如果不需要资源更新那么选择Resources.Load肯定是最好的,不过现在大多数游戏是离不开资源更新的,既然需要资源更新就必须要考虑AssetBundle,AssetBundle对于初学者来说确实很复杂(什么自己处理打包啦,打包的资源关系啦,加载需要考虑加载顺序啦,什么加载路径啦,每一项都需要仔细考虑),既然是做加载,首先考虑的就是快加载一定要快,这样用户体验才会好,经过各种的查阅,确定了一种加载方式那就是AssetBundle同步加载打资源时选择无压缩模式,经过测试这个方式的加载速度是很接近Resources的,找到正确的加载方式肯定是很兴奋,但是这种方式只能从可读写路径加载,意思是需要将资源解压到磁盘。当时没太考虑这点,结果上线后,什么机型都有,第一次启动需要解压,(低端机(512内存单核)上解压需要5分钟,还有时会崩内存),造成了一部分用户的流逝。(第一个项目的经历)
          第二个项目开始时,吸取前面的教训,怎么都想在支持资源更新的基础上把启动解压资源去掉,于是就考虑的AssetBundle的异步加载,正好Unity5有一个现成的加载Demo(New AssetBundle build system in Unity 5.0),Demo写的还是比较完善,不过还是有一些问题的,我做了一些修改和优化后,就直接拿到新项目中来使用,项目初期做过一些测试,资源都可以正常加载,内存也可以卸载,重要的是第一次启动不用解压,无比的欢乐。可到项目后期的时候,需要加载的资源越来越多,也越来越大,测试发现,加载速度是如此之慢到了无法忍受的地步,发现游戏的帧率会直接影响加载的速度,于是做了各种优化,最后还是没有达到想要的效果,(第二个项目)
           心想难道资源更新,第一次解压很慢,加载速度,都不能满足吗?应该怎么取舍呢?于是便找雨松和阿赵问问有什么好的方式:结果他们告诉我的方法大概都是一致的,那就是Resources 和 AssetBundle同步 结合来使用,AssetBundle异步最好不要去尝试,如果你不想死的很惨的话,
          通过讨论和自己的研究最终确定下来的方案:Resources 和 AssetBundle同步 结合来使用这个方法之前考虑过,当时是有两个问题(1.两种加载方式共存会不会有问题,2.无法达到最小化更新),最终是这样的出界面预设外的其他资源全部放到Resources 中,UI界面打成AB从磁盘来加载把UI关联的重复资源单独打出去(图集和字体),更新是UI预设可以直接打AB来更新,其他Resources  可以打成一个AB来更新。这是相对比较完美的结合
游客,如果您要查看本帖隐藏内容请回复






分享至:
| 人收藏
回复

使用道具 举报

该用户从未签到

沙发
xsf1993 发表于 2017-9-14 16:26:34 只看该作者
花给水管道
回复 支持 反对

使用道具 举报

该用户从未签到

地板
重庆生活网l 发表于 2017-10-25 19:07:58 只看该作者
谢谢啦,很有用!













淘客机器人、淘客返利机器人、淘宝客机器人 联系客服QQ:4000017854
回复 支持 反对

使用道具 举报

该用户从未签到

5#
重庆生活网l 发表于 2017-10-26 13:01:09 只看该作者
佩服你,能发这么好的帖子,厉害













第五代QQ机器人QQ群机器人论坛QQ机器人智能客服机器人QQplus机器人QQ群互联机器人..联系QQ4000017854
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2013-2017 ARinChina-增强现实中国技术论坛   All Rights Reserved.