Unity AssetBundles and Resources指引 (三) AssetBundle基础

本文内容主要翻译自下面这篇文章

https://unity3d.com/cn/learn/tutorials/topics/best-practices/guide-assetbundles-and-resources?playlist=30089  A guide to AssetBundles and Resources

 

第三部分 AssetBundle基础

3.1概览

AssetBundles系统提供一种手段把一个或多个Asset文件归档并能够被unity索引。目的就是分发能这些能够兼容unity序列化系统的数据,是安装后用来更新非代码内容的主要工具。使得能够减少安装包的尺寸和运行时内存压力。以及根据终端设备可选加载优化内容称为可行。

理解AssetBundle工作流程是构建成功的Unity移动设备项目的关键。

 

  3.2 什么是AssetBundle

一个AssetBundle包含两个部分:头部和数据部分。

头部是在构建AssetBundle时unity生成的。存放AssetBundle的信息,比如AssetBundle标记,AssetBundle是否压缩和一分清单。清单是有Object的名字作为索引的查找表。每个查找项提供一个给定名字的Object在数据段位置的字节索引。数据段包含所有Assets的序列化后的原始数据。如果数据段是压缩的。LZMA是整个数据段进行压缩的。即先把所有的Assets序列化,然后把整个字节流进行压缩。

unity5.3之前,AssetBundle内部不能单个Object压缩。如果是使用5.3之前的版本,如果要读取一个或者多个Obect,Unity就要解压整个AssetBundle。一般来说unity会缓存未压缩的版本来提高以后的加载效率。

5.3加入了LZ4压缩选型。用LZ4选项构造的AssetBundle会以单个Object为单位进行压缩。是的加载单个Object不用解压整个AssetBundle。

3.3 AssetBundle管理器

   Unity开发了一个AssetBundle的开源参考实现,可以从https://bitbucket.org/Unity-Technologies/assetbundledemo下载。

3.4 加载AssetBundle

在Unity5里面,AssetBundle可以通过4个API加载AssetBundle。这四个api会随着以下两个情况行为有所不同

  1. AssetBundle是LZMA压缩还是LZ4压缩或者是未压缩的
  2. 加载AssetBundle的平台

这四个Api分别是 AssetBundle.LoadFromMemoryAsync、 LoadFromFile、

LoadFromCacheOrDownLoad 和UnityWebRequest的DownloadHandlerAssetBundle。

3.4.1 LoadFromMemoryAsync

Unity建议不要用这个API。在5.3.2之前这个API名字叫CreateFromMemory。名字不一样但是功能一样。

这个方法从托管字节数组里面加载AssetBundle。他总是先将托管字节数组拷贝成本体字节数组。如果是LZMA压缩的,拷贝的时候就进行了解压。如果没压缩在原样拷贝。

这个api至少需要两倍的AssetBundle的尺寸内存。从AssetBundle里面加载的Asset会在内存里面拷贝3次:一次托管字节数组,一次本地内存拷贝还有一次就是Asset自身子啊GPU或者系统内存占用。

3.4.2 LoadFromFile

5.2之前叫CreateFromFile,名字不一样,但是功能是一样的。

如果是加载一个未压缩的AssetBundle,这api十分高效。如果是未压缩或者LZ4压缩,api行为如下:

移动设备上API只加载头信息。只要在Load一个Object才会去加载特定的对象。不会浪费别的内存。

在编辑器里面会加载整个AssetBundle进内存。

注意在安卓设备上,如果版本是5.3或者更老的版本,从StreamAssts目录加载会失败。因为这些内容在一个压缩的jar包里面。5.4后面修复了这个bug。

3.4.3 LoadFromCacheOrDownLoad

如果是从远程服务器上加载资源这是一个有用的api。如果是从本地文件系统加载可以用file://URL形式。如果内容已经存在本地缓存。这个api就和LoadFromFile一样。

如果没有缓存,就会从源处读取内容,如果是压缩的,他会用一个工作线程解压然后写进缓存。一旦缓存,则是未压缩的AssetBundle。

3.4.4 AssetBundleDownLoadHandler

5.3后为移动平台引进的api。比WWW更具弹性。允许开发者指定如果处理下载的数据以便消除不必要的内存消耗。

3..4.5 建议

一般来说,尽量使用LoadFromFile API。他更有效速度更快。如果需要从远程下载资源,5.3或更新的版本建议用UnityWebRequest,老的版本用WWW。

3.5 从AssetBundle加载Asset

可以用三个不同的api从AssetBundle加载Object:LoadAsset、LoadAllAsset和LoadAssetWithSubAsset。这些api都有异步版本。同步api会比异步要快至少1帧。在5.1或者更老的版本可以这么说。因为在这些版本中一帧至多只加载一个Object。这意味着加载多个Object的异步api版本会比相应的同步版本慢很多。5.2之后修复了这个问题。可以再一帧里面加载多个Object,加载多少要视设置的时间片。

当要加载多个不相关的Object时应该用LoadAllAssets。但是也只有在加载大部分或者全部时才使用。相比另外两个API,LoadALL版本会稍微快一些。但是如果AssetBundle里面资源很多,而要加载的不超过三分之二。建议重新分割AssetBundle为多个更小的AssetBundle,然后调用LoadAll版本。

加载细节:

加载不是在主线程上面运行的。其中数据读取是在工作线程上执行的。5.3之前加载对象是顺序执行,而且某些部分职能在主线程上面执行。当工作线程读完数据。他就会暂停执行让主线程进行整合集成(integration),直到主线程整合完毕才继续工作。5.3之后,对象加载可以并行。多个对象可以再工作线程上面反序列化,处理和整合。当对象完成加载。Awake回调会执行,然后在下一帧就可用了。

3.5.2 AssetBundle依赖

Unity5 的AssetBundle系统。AssetBundle的依赖关系是可以通过两个不同的api自动跟踪的。在编辑器里面,依赖关系可以通过assetdatabase api来查询。AssetBundle的分配和依赖可以通过AssetImporter API来访问和改变。运行时可以通过ScriptableObject的子类的 AssetBundleManifest API来访问。

如果一个AssetBundle的object引用到一个或者多个另外一个AssetBundle的Object,我们就称为AssetBundle依赖。就像第一部分描述的,AssetBundle可以作为其内部包含的object的本地ID和GUID的数据源。

因为Object只有在实例ID首次被引用时才加载。而且AssetBundle被加载的时候,才会被赋予一个正确的实例ID。因此AssetBundle加载的顺序是无关的。重要的是要先于加载一个对象之前先加载它所依赖的AssetBundle们。Unity不会自动加载所有的依赖AssetBundle,这是开发者的责任。

比如一个材质A引用一个贴图B。A打包进AssetBundle1,B打包进AssetBundle2.在这个用例中,AssetBundle2必须先与从AssetBundle1中加载材质A之前加载。但这并不要AssetBundle2比AssetBundle1先加载。

Unity不会再AssetBundle1加载的时候自动加载AssetBundle2.这必须手工通过脚本加载。而且加载AssetBundle1和2的api是无关的。无论是通过哪种api加载都可以。

3.5.3 AssetBundle清单

当通过buildpipeline生成AssetBundle时候,unity会生成一个依赖关系信息到一个单独的AssetBundle里面。放在所有的AssetBundles存放的共同父目录里面。他的里面存放了一个 AssetBundleManifest类型。它提供了一个GetAllAseetBundles API来查询所有的AssetBundle。 GetAllDependencies返回所有的依赖。包括一个依赖的依赖,以及依赖的依赖的依赖等等。GetDirectDependencies只返回直接依赖。、

3.5.4 建议

建议只加载所需要的对象。特别是移动平台上,因为他们本地存储读取速度非常慢,而且加载和卸载Object会触发垃圾回收。

转载于:https://www.cnblogs.com/qzzlw/p/5950487.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402853.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue项目启动成功浏览器不显示

场景:vue项目启动成功,无任何报错,但是浏览器却一直加载,页面始终是空白。 如果你的项目用到了element-ui的标签页组件el-tabs组件,那么大概率是此组件引起的浏览器卡死问题。 可以现将el-tabs的代码注释掉&#xff0c…

几种常用的清除浮动方法(一)

From: https://www.cnblogs.com/nxl0908/p/7245460.html 1、父级div定义伪类&#xff1a;after和zoom <style type"text/css"> .div1{background:#000080;border:1px solid red;}.div2{background:#800080;border:1px solid red;height:100px;margin-top:10px…

vi and vim 用法

a 在当前光标后面插入字符 i 在当前光标前面插入字符 I 在当前行首插入字符 A 在当前行尾插入字符 o(字母)在当前光标下一行插入字符 O(字母)在当前光标上一行插入字符 b移动光标到当前字符串的第一个字符 B移动光标到当前行的第一个字符(以空格分隔) cc 删除光标所在行并编辑 …

CentOS 7 yum 安装php5.6

配置yum源 追加CentOS 6.5的epel及remi源。 # rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm # rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm以下是CentOS 7.0的源。 # yum install epel-release # rp…

h5下载静态文件

1.需要将文件放src的下面的static的文件夹内 2.如果下载的是浏览器不能识别的&#xff08;例如&#xff1a;.exe,.zip,.doc等&#xff09;内容&#xff0c;浏览器会直接进行下载&#xff0c;但是如果下载的是浏览器可以识别的&#xff08;例如&#xff1a;.png,.jpg等&#xff…

浮动的清除 -- 四种方法

From: https://www.cnblogs.com/gchlcc/p/5824200.html 前言 -- 一个父亲不能被自己浮动的儿子&#xff0c;撑出高度。 开胃小菜 来看一个实验&#xff1a;现在有两个div&#xff0c;div身上没有任何属性。每个div中都有li&#xff0c;这些li都是浮动的。我们本以为这些li&a…

vue引入本地图片不显示;vue引入本地图片;

data () {return {imgUrl: require(/static/平安团意险.jpg), // 动态引入图片}},

目录索引

〇、接口、泛型、委托、事件 1.泛型和协变逆变2.委托和事件3.c#基础4.c#4.0协变逆变的理解一、linq等数据处理 1.数据查询2.数组3.linq 总结二、并行程序 1.并行性能简单分析三、编码技巧 1.考虑用类型代替参数检查2.c#没有指针导致的性能问题研究一二3.匿名函数递归4.代码设计…

equals和=,==的区别

一. 和equals的区别 1. 是运算符 2. equals是String对象的方法 一般有两种类型的比较 1. 基本数据类型的比较 2. 引用对象的比较 1. 基本数据类型的比较 和equals都比较的是值是否相等&#xff0c;相等则为true&#xff0c;否则为false 2. 引用对象的比较 和equals都是比较是栈…

eq相等,smarty 比较操作符!时间戳

2019独角兽企业重金招聘Python工程师标准>>> eq相等&#xff0c; ne、neq不相等&#xff0c; gt大于&#xff0c; lt小于&#xff0c; gte、ge大于等于&#xff0c; lte、le 小于等于&#xff0c; not非&#xff0c; mod求模。 is [not] div by是否能被某数整除&am…

阅读笔记四

学以致用 战国末期的思想家荀子曾经说过&#xff1a;“知之而不行&#xff0c;虽敦必困”。看到这句话&#xff0c;我想大家都知道它的意思&#xff0c;懂得许多道理却不付诸实践&#xff0c;虽然知识很丰厚&#xff0c;也必将遇到困厄。 没错&#xff0c;在这半个多月当中&…

推荐!!!【大杂烩】url、file、blob、base64互相转换

url地址或file文件获取base64 base64转blob blob或file转url&#xff1a; 使用URL.createObjectURL()方法读取出url js读取图片不同信息流

html页面通过特殊链接:打电话,发短信,发邮件详细教程

From: http://www.cnblogs.com/liuhongfeng/p/4976599.html 采用url href链接的方式&#xff0c;实现在Safari ios&#xff0c;Android 浏览器&#xff0c;webos浏览器&#xff0c;塞班浏览器&#xff0c;IE&#xff0c;Operamini等主流浏览器&#xff0c;进行拨打电话功能。…

Photoshop切图学习

前端开发中&#xff0c;之前都是Designer给我们切好图&#xff0c;给出readline&#xff0c;所以我们前端工程师基本不自己动手切图&#xff0c;现在换了新的公司&#xff0c;需要我们自己手动切一些图。Designer制作好的psd的图片如下&#xff1a; 自己想达到以下要求&#xf…

【vant】van-list的滚动加载onload事件

1.van-list的滚动加载onload事件&#xff1a;onload莫名执行多次或者一直加载到所有数据。 2.官方说了&#xff0c;不能使用float和overflow。包括父级元素和html和body都不要用这些触发BFC的属性 3.滑动到底部会触发该事件&#xff08;一定要注意父级标签&#xff0c;甚至 htm…

C#操作XmlDocument对象 报缺少根节点 一一道来

C# 操作XmlDocument文档 1.第一步选择文件目录string FileNamestring.Empty;SaveFileDialog sfdnew SaveFileDialog();if(sfd.ShowDialog() DialogResult.OK){ FileName sfd.FileName; }FileStream fs;//判断文件是否存在if(!File.Exists(FileName)){ fs File.Create(…

微信小程序开发demo-地图定位

要求要完成的功能&#xff1a; 1.要完成的要点是城市定位。 2.就是切换城市。 首页我们先参照微信小程序开放的官方文档找到&#xff1a; 在这里我们可以找到”当前位置经纬度“ getLocation: function (){var that this wx.getLocation({success: function (res) {console.lo…

移动端H5下载后端文件

首先是手机H5移动端上&#xff0c;针对能直接打开的文件例如pdf等&#xff0c;下载是直接打开预览了。如果要真正保存到手机里&#xff0c;需要点击右上角三个点去那里面选择保存。对于非预览文件会直接下载。 而在有些浏览器里&#xff0c;是可以直接下载出文件的。感觉这个与…

[CSS] 眼下最流行的五大CSS框架,你都知道么?

From: http://developer.51cto.com/art/201710/555733.htm 如今&#xff0c;CSS框架越来越受欢迎&#xff0c;可以说已经应用到每一个网站上了。作为开发工具&#xff0c;CSS框架一直处于不断进化和改进的状态&#xff0c;因此我们强烈建议您关注眼下的趋势。这篇文章会带您了…

centos5.8上安装git server

Git 可以使用四种主要的协议来传输数据&#xff1a;SSH 协议&#xff0c;Git 协议和 HTTP 协议。下面将一一介绍如何在服务端和客户端搭建和使用git的这些协议。 基础环境&#xff1a; git server:172.16.29.24 centos5.8 git client:172.16.29.25 centos5.8 首先需要在两在机…