前言
Unity资源管理部分的功能很强大,会帮你做好很多东西,但是由于Unity设计目标是超级通用性,所以很多时候你要更多去了解其原理,才能保证使用的正确性和高效性,否则很容易掉坑里。
这里我结合以前看过的Unity4.2的源代码和部分文档,浅谈下Unity的资源管理部分的一些东西。常言道:“庖丁解牛,恢恢乎”,个人认为源代码是唯一没有二义性的文档。
3种资源读取方式
- Resources:支持编辑器模式和发布模式
- AssetDatabase :仅仅支持编辑器模式
- AssetBundle: 支持编辑器模式和发布模式
接下来,让我们看下这3种资源获取方式的优缺点。
Resources
你可以认为,unity给你提供了一个特定的包Resources。在编辑器模式下,它以文件夹的形式存在,你可以随意放置里边的散文件。在打包过程中,unity则自动帮你把Resources文件夹的所有东西打包。
优点
开发时绝对的方便。
缺点
Resources文件夹下的任何一点点修改,都会导致Resources包的重打。
AssetDatabase
优点
AssetDatabase 在编辑器模式下超级方便。
缺点
在正式发布版不能用,要用AssetBundle来替换。
AssetBundle
优点
你可以根据自己的项目实际情况自定义打包粒度,很好的支持热更新,就连unity 4.0里被大家吐的最多的槽点——资源依赖问题在unity 5.0以上也被完美的解决了。
缺点
AssetBundle从第一天出生就不是给开发环境用的,如果要修改贴图,每一张都得打包再测试。(信不信愤怒的美术同学过来找你,呵呵。)
3种资源获取方式的优缺点总结
- Resources :适合开发模式,不适合热更。
- AssetDatabase:仅仅支持编辑器模式,在发布版本要用AssetBundle 取代。
- AssetBundle:很好的支持热更,适合发布模式,但开发模式千万别用。
资源读取异步的支持
unity引擎内部加载异步管理器(C++类: PreloadManager )负责处理所有的异步加载请求(C++类:PreloadLevelOperation,继承自C++ 类AsyncOperation )。
注意
- ResourceRequest 和 AssetBundleRequest 继承自C#的 AsyncOperation,此 AsyncOperation非彼AsyncOperation也。
- C#的 AsyncOperation和 C++ 的 AsyncOpera tion名字相同,但这是两个类,C#的单向关联C++。
Application.backgroundLoadingPriority 就是操作的 PreloadManager。(网络上有些文章说unity的异步机制是伪多线程,这是不实的。)PreloadManager的确是多线程的。
建议
包装下unity的异步操作,用一个优先级桶排队来push引擎异步指令。
每次按照优先级从上述的指令桶中pop,1个或几个指令,按照指令创建AsyncOperation给引擎,当这些AsyncOperation都执行完,再重复操作。这样既可以抑制创建AsyncOperation风暴,又可以做到自定义优先级。
不建议
不要短时间push给unity太多的异步操作,这样会加重unity的负担,同时也不利于我们控制资源的加载优先级。
更多unity2018的功能介绍请到paws3d爪爪学院查找。