Unity AssetBundle介绍

Unity AssetBundle介绍1.什么是AssetBundle?AssetBundle是一种资源压缩包。资源打包AssetBundle有两个好处:减小安装包的大小,资源可以在进入游戏时候,网络下载。 热更资源,方便修复线上资源问题引起的Bug,或新增加游戏内容。AssetBundle分为两种类型:场景AssetBundle&非场景AssetBundle。2.AssetBundle结构2.1As…

大家好,又见面了,我是你们的朋友全栈君。

1.什么是AssetBundle?

AssetBundle是一种资源压缩包。资源打包AssetBundle有两个好处:

  1. 减小安装包的大小,资源可以在进入游戏时候,网络下载。
  2. 热更资源,方便修复线上资源问题引起的Bug,或新增加游戏内容。

AssetBundle分为两种类型:场景AssetBundle & 非场景AssetBundle。

2.AssetBundle结构

2.1 AssetBundle由两部分组成:Header和Data。

  1. 头部包含AssetBundle资源的信息( 版本号,文件信息,数据类型,压缩类型)等,文件信息记录了数据部分里边每个资源的文件名以及每个资源在整个AssetBundle文件中的offset和size,通过这个信息可以直接获取AssetBundle中某个资源的数据。从Unity5.3开始这部分数据会单独生成一个跟AssetBundle同名的.mainfest文件。
  2. 数据段包含打包到AssetBundle中的资源(模型,贴图,Shader,预制体,声音,场景)等。

非场景AssetBundle结构:

Unity AssetBundle介绍

场景AssetBundle结构:(PreloadData,AssetBundle应该是在Shared data中,更多的Objects在SerializedFile中)

 Unity AssetBundle介绍

全局光照数据(Global Illumination Data)

SerializedFile中记录着重建资源所需的信息。

Profiler中SerializedFile的大体组成如下:

  • 14KB File Read Cache
  • (较大)TypeTree,用于兼容老版本打包的AssetBundle在新版本中使用。BuildAssetBundleOptions.DisableWriteTypeTree可关闭兼容,减小内存占用。
  • 一个AssetBundle有外部引用,自动分配一个72KB的内存。
  • (较小,与AB内的Object数量相关)Object map & infos
  • 2017.4.8以后(一个AssetBundle有外部引用,自动分配一个4KB的内存。)

2.2 经过压缩后的AssetBundle:

采用压缩(LZMA,LZ4)的AssetBundle数据段的格式:Unity AssetBundle介绍

图中压缩部分表示可有块压缩(chunk-based)、流压缩(stream-based)两种方式。流压缩(LZMA)在处理整个数据块时使用同一个字典,它提供了最大可能的压缩率但只支持顺序读取。块压缩(LZ4)指的是原始数据被分成大小相同的子块并单独压缩。如果你想要实时解压/随机读取开销小,则应该使用这种。


Unity安装包中有两个工具,可反编译已打包的AssetBundle

1.WebExtrct

Unity AssetBundle介绍

可查看AssetBundle信息,如上图,可查看AssetBundle版本,大小。同时得到一个16进度文本。 

Unity AssetBundle介绍

2.binary2text 进一步处理上一步的16进度文本。

Unity AssetBundle介绍

Unity AssetBundle介绍

size = AssetBundle中某个资源的大小

Unity AssetBundle介绍

1. External References = 有其他AssetBundle引用,列在此处。

2. m_Container = AssetBundle文件中的所有资源。

  • m_FileID = External References中依赖的ID。例如m_FileID = 1,对应External Referencespath(1):xxxxxxxx。xxxx就是被依赖的资源。对应如果m_FileID = 0;说明没有依赖其他AssetBundle。
  • m_PathID = 某个资源在AssetBundle中的唯一Id

3. 加载某个资源,需要依赖的资源在m_PreloadTable中查找

  • preloadIndex = m_PreloadTable中的index。
  • preloadSize = m_PreloadTable中的index开始到+index+preloadSize的资源。

PS:LoadAsset 传入string,去m_Container中,然后Preload中查找依赖的的资源。组成需要的资源,返回需要的资源。

  • AssetId = m_FileID + m_PathID 
  • InstanceId 每次实例化对象,ID高位加2,因此不唯一
  • MonoScript 有一个GUID 关联DLL里边的Class

AssetBundle构建出现差异,但是上边的16进度文本一致。float精度不够造成的。可用-hexfloat对比前后两个版本的Assetbundle。Unity AssetBundle介绍

参考:

https://docs.unity3d.com/Manual/ClassIDReference.html

https://www.cnblogs.com/pinkfloyd/p/6489979.html

https://blog.csdn.net/qq_35361471/article/details/82854560

https://www.youtube.com/watch?v=mMjcDjM8Fm8

https://blog.csdn.net/lodypig/article/details/51863683

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/150286.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android App程序退出 黑屏问题

    Android App程序退出 黑屏问题在退出App的时候手机会闪动一下,出现像黑屏一样的效果,不是程序崩溃的效果就只是单单的黑一下,然后退出。。这个怎么破???记录下来:等解决了,回来更新。。。。。。。。。

    2022年7月17日
    23
  • RPM安装命令总结[通俗易懂]

    RPM安装命令总结[通俗易懂]在Linux操作系统下,几乎所有的软件均通过RPM进行安装、卸载及管理等操作。RPM的全称为RedhatPackageManager,是由Redhat公司提出的,用于管理Linux下软件包的软件。Linux安装时,除了几个核心模块以外,其余几乎所有的模块均通过RPM完成安装。RPM有五种操作模式,分别为:安装、卸载、升级、查询和验证。1)用RPM安装软件包,最简单的

    2022年6月12日
    31
  • Spring Boot2.0迁移概括

    Spring Boot2.0迁移概括首先,SpringBoot2.0需要Java8或更高版本。不再支持Java6和7了。在SpringBoot2.0中,许多配置属性被重新命名/删除,开发人员需要更新application.properties/application.yml相应的配置。为了帮助你解决这一问题,SpringBoot发布了一个新spring-boot-properties-migr…

    2022年5月27日
    66
  • MySQL 全局锁、表锁和行锁「建议收藏」

    MySQL 全局锁、表锁和行锁

    2022年2月17日
    49
  • c++全局变量与静态变量「建议收藏」

    c++全局变量与静态变量「建议收藏」概述:全局变量和和由static修饰的静态变量都被储存在全局数据区。全局数据区的内存在程序运行时会被全部置’0′.这不同于局部变量,局部变量在栈上分配内存,但此块内存一般不为零,且编译器不会在局部变量被声明的地方为其置’0′,除非申明时对其初始化值为0.全局变量:申明在main函数外的变量被编译器视为全局变量。即其在整个文件的任何地方都可以使用它。对于其他源文件来说,全局变量…

    2022年5月13日
    39
  • 织梦自定义表单 在线报名 在线预约听语音

    织梦自定义表单 在线报名 在线预约听语音

    2021年9月25日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号