Unity5-ABSystem(一):AssetBundle原理
说明
本系列所使用unity版本为5.3.4f1。
AssetBundle简介
AssetBundle是Unity Pro提供和推荐的资源导出方式,它可以把多个自定义的游戏对象或者资源以二进制形式保存到Assetbundle文件中。Assetbundle支持所有unity可识别的格式:模型、贴图、音频、整个场景等,其中最为方便的是可以将关联的内容制作成一个prefab,例如一个模型的贴图、动作和模型等,然后将整个prefab导出到AssetBundle,即可保留prefab中资源和脚本之间相互关联。
AssetBundle内部格式
以下图来自官网,黑体为翻译。
一个AssetBundle本质上是将一些对象组合成一个序列化文件,根据是普通bundle(normal bundle)还是场景bundle(scene bundle),Assetbundle可以展开成略有不同的数据文件。
normal bundle
scene bundle
后面会详细讲到其内部格式,现在可以看到,普通的AssetBundle包含了本身信息(Assetbundle)、各个对象和音频文件,而场景Assetbundle还包含了预加载数据(PreloadData)、shaderData和全局光照数据(Global Illumination Data)。
压缩
AssetBundle可以选择是否压缩,Unity5.3之前只能使用LZMA压缩,Unity5.3之后支持选择LZ4压缩。
图中压缩部分显示了可能有块压缩(chunk-based)和流压缩(stream-based)两种方式。块压缩(LZ4)指的是原始数据被分成大小相同的子块并单独压缩。如果你想要实时解压/随机读取开销小,则应该使用这种。而流压缩(LZMA)在处理整个数据块时使用同一个字典,它提供了最大可能的压缩率但只支持顺序读取。
LZMA压缩方式的优点在于AssetBundle压缩率较高,但只能顺序读取意味着加载任意一个资源时,都需要将整个AssetBundle解压,造成卡顿和额外内存占用。LZ4压缩率较低(测试LZMA换LZ4:86.9M -> 108M),但不需要全部解压即可读取,不会有大的卡顿和额外内存占用。后面会详细对比两种压缩方式。
AssetBundle内部格式
这里有一篇Unity3D asset bundle 格式简析,分析了unity3.5下Assetbundle的内部格式,总结下来结构如下:
- AssetBundleFileHead : 记录了版本、是否压缩等主要描述信息。
- AssetFileHeader :包含一个文件列表,记录了每个资源的name,offset,length等。
- Asset1 : 第一个资源本身,内部结构如下
- AssetHeader :包含了TypeTree大小、文件大小、format等。
- TypeTree(可选):记录了asset 对象的class id,在 Unity3d 的官方文档 可以查到每个id的对象。
- ObjectPath :主要记录了一个pathID(资源唯一索引id)。
- AssetRef:记录了AssetBundle对外部资源的引用情况。
- Asset2 :第二个资源,结构跟上面一样
- ……> : 更多资源
大致符合官网上normal bundle的内容,看来Unity在方面变动不大,文中也提到了分析方式是阅读disunity源码,而disunity也已经支持了unity5,有兴趣也可以分析unity5中Assetbundle的内部结构。
Unity5-ABSystem(一):AssetBundle原理的更多相关文章
- Unity5.x版本AssetBundle加载研究
之前说了 “Unity5.x版本AssetBundle打包研究”,没看过的请先看一下:http://www.shihuanjue.com/?p=57 再来看本文,有一定的连接性. 先梳理一下思路: 要 ...
- Unity5.X 新版AssetBundle打包控制
一.什么是AssetBundle 估计很多人只知道Unity的模型之类的东西可以导出成一种叫做AssetBundle的文件,然后打包后可以在Unity程序运行的时候再加载出来用.那么AssetBund ...
- Unity5.x版本AssetBundle打包研究
Unity5的AssetBundle打包机制和以前版本不太一样.简单的说就是,只要给你要打包的资源设置一个AssetBundleName ,Unity自身会对这些设置了名字的资源进行打包,如果一个资源 ...
- Unity5版本的AssetBundle打包方案之打包Scene场景
using UnityEngine; using System.Collections; using UnityEditor; /// <summary> /// 脚本位置:Editor文 ...
- Unity5系列资源管理AssetBundle——更新实现
前面我们研究了AssetBundle的打包与加载,现在我们来了解下如何在项目中根据版本号更新内容. 最最重要的一点,细心的朋友应该看到了在加载AssetBundle的MrcAssetManager类中 ...
- Unity5系列资源管理AssetBundle——加载
上次我们进行了AssetBundle打包,现在我们还把打包的资源加载到我们的游戏中.在加载之前,我们需要把打包好的Bundle包裹放到服务器上,如果没有,也可以使用XAMPP搭建本地服务器. 加载的A ...
- Unity5系列资源管理AssetBundle——打包
资源管理是游戏开发的重要环节,Unity中使用AssetBundle可以非常方便地帮我们打包和更新游戏内容,在5系列中,AssetBundle更是方便好用,现在让我们先进行打包吧. 刚说了,5系列打包 ...
- Unity5.X 新版AssetBundle使用方案及策略
1.概览 Unity3D 5.0版本之后的AssetBundle机制和之前的4.x版本已经发生了很大的变化,一些曾经常用的流程已经不再使用,甚至一些老的API已经被新的API所取代. 因此,本文的主要 ...
- Unity5.4新版AssetBundle资源打包
(1)新版本 唯一打包API Buildpipeline.BuildAssetBundle (2)在资源的Inpector界面最下方可设置该资源的assetbundleName, 每个assetbun ...
随机推荐
- rt.jar包添加源文件只需要关联到已安装对应jdk目录下source.zip源码文件即可
项目中配置的JRE System Libriry下的rt.jar包,需要关联源文件时候,只需要点击“Attach Source...“按钮,选择"External File..." ...
- cmd控制台 wrapper | OpenSCManager failed - 拒绝访问。 (0x5)解决
在windows上安装mycat执行命令时, D:\develop\Mycat\bin>mycat.bat install 返回wrapper | OpenSCManager failed - ...
- 详解es6 class语法糖中constructor方法和super的作用
大多数面向对象的编程语言都支持类和类继承的特性,而JS却不支持这些特性,只能通过其他方法定义并关联多个相似的对象,这种状态一直延续到了ES5.由于类似的库层出不穷,最终还是在ECMAScript 6中 ...
- Kafka 学习笔记之 Topic日志清理
Topic日志清理 server.properties: log.cleanup.policy=delete (默认) 1. 按时间维度进行Kafka日志清理 log.retention.hours= ...
- Eclipse的debug按钮介绍(三)
本文链接:https://blog.csdn.net/u011781521/article/details/55000066 http://blog.csdn.net/u010075335/ar ...
- Java 从入门到进阶之路(七)
在之前的文章中我们介绍了一下 java 中的对象和类,接下来我们来看一下 Java 中的方法重载. 在显示生活中,我们肯定会遇到这样一个问题,那就是我们再商场买东西的时候在付账时的选择.如下 A:在收 ...
- vue 上传文件 和 下载文件 面试的时候被问到过
Vue上传文件,不必使用什么element 的uplaod, 也不用什么npm上找的个人写的包,就用原生的Vue加axios就行了, 废话不多说,直接上代码:html: <input type= ...
- 执行Django数据迁移,报错 1091
问题描述 今天在Pycharm 中的Terminal下,执行数据迁移操作时,第一步: Python manage.py makemigrations ,是没有任何问题,但就是在执行真正的数据迁移时,也 ...
- spring boot参数验证
必须要知道 简述 JSR303/JSR-349,hibernate validation,spring validation 之间的关系 JSR303 是一项标准,JSR-349 是其的升级版本,添加 ...
- TP框架配合jquery进行3种方式的多图片上传
用的TP5.1框架+jquery 一 使用form表单方式进行多图片上传 html代码: <form action="../admin/admin/cs" enctype=& ...