zoukankan      html  css  js  c++  java
  • U3D资源动态加载异步方案探究

    准备使用C#的多线程机制进行资源的异步加载,写好了数据结构、同步互斥等,最后发现很恶心的一个限制:

    “...\Runtime\ExportGenerated\Editor\BaseClass.cs:1310”

    真是相当恶心的一个错误,解释起来就是:

    Resources.Load()方法不能在出主线程意外的线程中调用,所以考虑使用C#多线程实现资源后台加载的方案搁浅了(郁闷中)...

    经测试,Instantiate()方法和Load()一样,也只能在Main Thread中调用。

    PS:U3D自己没提供很好的异步机制(除了AssetBundle,但AssetBundle需要对资源进行打包,我做的是本地化游戏啊大哥-_-|||),却有不让在Background Thread中进行Resources.Load(),真心感觉这是U3D目前版本的一大缺陷。希望后续版本中能够提供诸如Reources.LoadAsync()函数,或者能将Resource.Load()的使用权限分配给非主线程,亦或者将Resources.Load的源代码开放,让我们自己将其修改成异步的...

    闲话少叙,妥协了,使用WWW...

    关于运行时卡,有2各方面:

    (1)资源加载卡,即Resources.Load()卡、WWW.AssetBundle.Load()卡;

    (2)实例化过程卡,Instantiate()卡。

     1、资源加载卡

      现象1:在同一场景中(即不进行场景切换),同一个资源,在第一次Load时,会卡,第二次、第三次...第N次加载时不卡;

      现象2:在不同场景(切换不同场景),同一资源在每个场景中第一次加载时都会卡。

        附上一组测试数据:

      测试用例:对由40个特效组成的资源包进行Load()操作。(下标中的时间为加载操作耗时)

        第一次Load  第二次Load  第三次Load

    场景1  0.236s    0.0015s    0.0016s

    场景2  0.247s    0.0016s    0.0016s

      个人理解:对于同一Scene中的资源,第一次Load时会卡一次,然后第二次、第三次Load时都不会卡,因为Unity3D内部做了缓存。但跳转场景后,再Load同一资源,第一次还是会卡,可能是因为Unity3D底层在跳转场景时会清空Load(加载)资源列表的缓存。

     

  • 相关阅读:
    静态INCLUDE与动态INCLUDE的区别
    SQL注入
    SpringMVC
    设计模式—七大原则
    Demo小细节-2
    Java运算符
    Java内部类的基本解析
    接口类和抽象类
    Statement和PreparedStatement
    ArrayList,LinkedLIst,HashMap
  • 原文地址:https://www.cnblogs.com/sifenkesi/p/2443514.html
Copyright © 2011-2022 走看看