深入理解unity资源与ab包

深入理解unity资源与ab包

ID:47535089

大小:233.95 KB

页数:10页

时间:2020-01-13

深入理解unity资源与ab包_第1页
深入理解unity资源与ab包_第2页
深入理解unity资源与ab包_第3页
深入理解unity资源与ab包_第4页
深入理解unity资源与ab包_第5页
资源描述:

《深入理解unity资源与ab包》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、深入理解资源(Asset)与AssetBundleAB包文件Assetbundle文件格式可以理解为,拥有一个列表头和压缩数据块列表。列表头定义了各数据块的起始位置和大小。数据块列表中存储压缩过的unity对象的序列化数据。AssetBundle对象加载并创建AssetBundle对象。Assetbundle对象是一个轻量级对象,只包含一个资源(Asset)对象列表和指向实际AB包数据的文件对象。AB包文件加载完成后存放在内存中,注意只有LZ4能够以压缩格式存放在内存中。这段内存不能直接访问,由AssetBundle对象负责管理。AssetBundle.Unload()会释放这

2、段内存。Asset资源实际上unity中并没有与资源(Asset)这个词对应的类。我们一般把从AssetBundle中LoadAsset()出来的对象称为资源(Asset)。AssetBundle.LoadAsset()等接口从AssetBundle对象中解压数据反序列化构建Object。Unity完美的序列化机制可以使任何对象都可以直接序列化为连续内存块,同样任何对象都可以通过AssetBundle.LoadAsset()反序列化为结构化对象。AssetBundle.LoadAsset()接口返回类型是Object。此功能也暗示了可以将任何对象从ab包内存中反序列化出来构建。

3、Prefab是什么?创建ab包时,一般会将prefab打入到包中。游戏中通过AssetBundle.LoadAsset()将prefab对象加载出来。代码1:再通过加载出来的prefab构建GameObject:代码2:思考:代码1中m_Prefab是什么?是什么类型?如果是GameObject,那么这个GameObject为什么没有出现在场景中?如果是GameObject,为什么一定要通过Instantiate再次clone一个GameObject出来?Unity的C++代码分为两部分,Runtime和Editor。Runtime中包含引擎的所有核心功能,Editor包含编辑

4、器所需核心功能。Prefab.h/cpp存放于Editor中,实现了编辑器中prefab的功能。Prefab继承于Object,包含一个指向GameObject的指针。其功能非常简单,仅仅只是维护编辑器中prefab之间的关联关系,用来实现编辑器中prefab修改编辑功能。Prefab只是对GameObject在编辑器中一个功能封装。上一段源码:从源码判断,Prefab功能非常简单,只是实现编辑器中各prefab关联编辑功能。结论:因此可以推断,在最终发布环境中,并无Prefab对象存在。代码1中LoadAsset构建的对象是GameObject,此GameObject并不存在

5、于当前场景(scene)中,而是被unity放到了一个空场景中。LoadAsset构建的GameObject对象,Unity希望我们把它当作资源(asset)使用。对比代码2中m_Prefab和m_GameObject的scene变量。思考?为什么不能需要构建GameObject时,直接从AssetBundle中反序列化构建呢?推测Unity希望开发者们遵循的工程实践是,将AssetBundle中反序列化构建的GameObject作为资源(asset)进行管理。当游戏中需要构建GameObject时,以资源(asset)为基础构建,而不是从连续内存上反序列化去构建。从而将对象构

6、建与数据解压解耦。资源(Asset)资源(Asset)是unity希望开发者们遵循的一种工程实践规范。1.所有AssetBundle中LoadAsset出来的对象称为资源(Asset)。2.资源(Asset)与AssetBundle之间有强耦合关系。3.资源(Asset)不要直接被使用在业务逻辑中。资源(Asset)和业务中创建的对象没有功能上不同。但在使用方法上有截然不同的区分。资源(Asset)可以由AssetBundle.Unload(true)统一强制销毁,也可以单个销毁。但是对于同一个AssetBundle,LoadAsset出的资源(Asset)只能被销毁一次,销毁

7、后再重复LoadAsset()会失败。Instantiate()英文翻译为”实例化”,个人觉得这个接口用英文克隆”clone”描述更准确。Object.Instantiate()可以对任何对象clone。包括Texture、Shader、AudioClip,当然应该不会有人对这类内存占用大且不会被修改的对象clone。所以,遵循unity暗示的工程实践规范。所有占用大量内存且不会被修改的资源(Asset)不被clone,所有需要修改的逻辑对象会被clone出一个新的实例。如下图所示:Inst

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。