Unity 关于资源加载的时间消耗

 用过Unity的人应该都会有一种这样的感觉,当我们需要加载一个预设并生成在场景里面的时候,第一次生成该模型总会有卡顿一下的感觉。
        既然卡顿了,那么可以理解成是掉帧了。掉帧的原因,也可以肯定就是某一帧里面需要执行的东西消耗的时间过多。我最近针对这个问题,做了一些小尝试,发现了一些小问题。
        一般来说把一个预设物体生成在场景里面需要这么几个步骤
1、加载文件,如果是内部Resource文件就不需要加载文件,但AssetBundle是需要先加载某个文件,再转成AssetBundle的。
2、读取资源,可能是Resource.Load,或者是AssetBundle.LoadAsset,把资源读成Object
3、生成模型,一般是使用GameObject.Instantiate方法把Object生成为GameObject
        下面我就逐个步骤去计算时间,看看究竟时间都消耗在哪方面。分别使用了一台i5的PC和一台红米note手机作为测试对象


 一、加载文件


        首先是加载文件。这个只考虑AssetBundle的情况。加载的方式一般有3种,一种是www读取AssetBundle文件,第二种是使用Unity自带的LoadFromFile(CreateFromFile)方法读取AssetBundle文件,第三种方法是把AssetBundle文件按照byte来读取文件,然后再将bytes转成AssetBundle方法。
        这三种方式我测试过,其实差别不大,区别在于第一种是异步的加载,后面两种是同步的。而我采用的是第三种,因为那样控制起来会比较随心所欲。
        而时间方面,一般加载的文件不大,在几M以内的,基本都能在1毫秒内完成加载。

  

二、读取资源


        以一个实际AssetBundle文件(未经压缩)的大小为3M左右,里面包含了多层嵌套的特效模型为例子,做加载。
        在Resource.Load的情况下和在AssetBundle.LoadAsset的情况下读取(单独一个assetbundle文件,没有拆依赖),经过多次试验,时间差别不大,在PC端都是30毫秒左右,而在手机端都在90毫秒左右。而Resource.Load会稍微快一点点,以手机端为例,大概是在88-89毫秒,而AssetBundle.LoadAsset会是在90-93毫秒。
        根据分析,这个模型消耗这么多的读取时间,是因为里面的嵌套内容比较多,如果把它拆分一下引用,它会引用了多个依赖,包括多个模型网格、材质和贴图。按照我之前的依赖拆分理论,它最终被拆成了4个材质球和2张贴图,共6个依赖。
        如果把他们的依赖拆散,再来读取AssetBundle,读取包含依赖在内的7个AssetBundle文件,再分别loadAsset,最终在手机端读取的时间是130毫秒左右。


三、生成模型


        既然已经拿到了Object信息,接下来就可以用GameObject.Instantiate方法来生成模型了。在以前我一直有一个感觉,认为是因为GameObject.Instantiate这个方法需要申请内存而导致了卡顿的。
        测试的结果,GameObject.Instantiate方法并没有什么时间上的消耗的,一般都会在1毫秒内就能完成。有一些特殊的模型会消耗一定的时间,但很少见,比如某些UGUI的UI模型比较复杂,在生成的时候会花费一定的时间。在PC端是很奇怪的,都是刚好消耗了10毫秒;手机端就有一些差异,会在10毫秒之内,比如6毫秒或者8毫秒那样。
        出现的GameObject.Instantiate消耗时间的情况确实不多,整个大场景和完整UI加载出来了,才出现过2、3次而已。
        测试结果出来了,可以分析一下问题的所在。
        不难看出,基本的时间消耗都在读取资源那一步。而且读取单一的文件,会比同一个文件拆分多个依赖读取需要的时间短。这里我们可以得出一些结论
        1、读取完的资源尽量保存起来,下次再请求读取的时候就可以直接返回结果。
        2、再次说明了资源的依赖不要拆得太散,能不拆尽量不拆,不然虽然在容量上占优势了,但加载的时候卡,也是得不偿失的。

        3、由于读取大文件的时间还是长,以30fps算,一帧也才33毫秒的时间,并不能处理很多读取资源的业务。所以可以考虑异步读取资源或者提前读取资源,然后保存起来备用。


(转自:http://www.taidous.com/forum.php?mod=viewthread&tid=42773&extra=page%3D1&page=1)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值