浅谈Unity的资源管理部分
前言
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爪爪学院查找。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
java并发多线程显式锁Condition条件简介分析与监视器 多线程下篇(四)
java并发多线程显式锁Condition条件简介分析与监视器 多线程下篇(四) Lock接口提供了方法Condition newCondition();用于获取对应锁的条件,可以在这个条件对象上调用监视器方法 可以理解为,原本借助于synchronized关键字以及锁对象,配备了一个监视器 而显式锁Lock与Condition则针对于一个锁对象,提供了多个监视器 尽管是提供了多个监视器,但是需要记住,是Lock接口提供方法才能够获取到条件对象,所以这些条件对象仍旧是绑定到某一把锁上的 我相信,只要理解了监视器的概念,对于Condition理解起来是不会存在任何难度的,因为本身就是另外一种实现方式 从下图可以直观的感受到Condition是作为Object监视器方法的另外实现 wait在这边叫做await notify在这边叫做signal 等待 await 在监视器上等待 void await() throws InterruptedException; ,看得出来,此方法是支持中断的 除非发生以下事件,否则将会持续等待 其他某个线程调用此 Condition 的 signal() ...
- 下一篇
java并发汇总
volatile volatile (https://www.jianshu.com/p/506c1e38a922) 寒泉子bolg (http://lovestblog.cn/blog/archives/) 基于栈与基于寄存器,大杂烩 (https://rednaxelafx.iteye.com/blog/492667)4.ContextSwitch(http://itindex.net/detail/42231-java-%E8%A7%86%E8%A7%92-%E7%90%86%E8%A7%A3) 5.happens-Before(http://ifeve.com/easy-happens-before/)
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Mario游戏-低调大师作品
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用