一、AssetBundle的压缩方式

  Unity支持三种AssetBundle打包的压缩方式:LZMA, LZ4, 以及不压缩。
 
 1、LZMA压缩方式

 是一种默认的压缩形式,这种标准压缩格式是一个单一LZMA流序列化数据文件,并且在使用前需要解压缩整个包体。LZMA压缩是比较流行的压缩格式,能使压缩后文件达到最小,但是解压相对缓慢,导致加载时需要较长的解压时间。
 
 2、LZ4压缩方式
 Unity支持LZ4压缩,能使得压缩量更大,而且在使用资源包前不需要解压整个包体。LZ4压缩是一种“Chunk-based”算法,因此当对象从LZ4压缩包中加载时,只有这个对象的对应模块被解压即可,这速度更快,意味着不需要等待解压整个包体。LZ4压缩格式是在Unity5.3版本中开始引入的,之前的版本不可用。
 
 3、不压缩的方式
 不压缩的方式打包后包体会很大,,导致很占用空间,但是一旦下载Assetbundle,访问非常快。不推荐这种方式打包,因为现在的加载功能做的很友好了,完全可以用加载界面来进行后台加载资源,而且时间也不长。
 
二、压缩包的缓存
    WWW.LoadFromCacheOrDownload函数能下载和缓存资源包到磁盘中,从而能大大加快以后的加载。从Unity5.3开始,缓存数据也可以用LZ4算法压缩,相对于不压缩缓存数据,这能节省40%——60%的的空间。在下载期间进行压缩,因此用户几乎是感觉不到的。从套接字(Socket)接收的数据,Unity将对它进行解压并且用LZ4格式压缩它。这种压缩发生在以流的形式下载过程中,这意味着一旦足够的数据被下载了,缓存遍开始压缩,并且这样一致持续到下载完成。之后在需要使用的时候,数据从缓存中通过飞速解压的方式读取出来。
  缓存压缩是默认启用的,它是由Caching.compressionEnabled属性控制的,它能影响到在磁盘中保存的资源包以及缓存在内存中的资源包。
 
三、AssetBundle加载API概述
以下这张表是当使用不同的压缩方式和不同的加载方法时,内存和性能的开销情况比较:
      

   不压缩  LZ4压缩 LZMA压缩 
 WWW加载 内存:未压缩资源包的大小(+当WWW未被Disposed时未压缩资源包的大小)
性能:没有额外的处理过程
 内存:LZ4高压缩包的大小(+当WWW未被Disposed时LZ4高压缩包的大小)
性能:没有额外的处理过程
内存:LZ4压缩包的大小(+当WWW未被Disposed时LZMA压缩包的大小)
性能:当下载的时候,LZMA解压过程+LZ4压缩过程
 LoadFromCacheOrDownload加载 内存:没有额外内存占用
性能:从磁盘读取的过程
内存: 没有额外内存占用
性能:从磁盘读取的过程
内存:没有额外内存占用
性能:从磁盘读取的过程
LoadFromMemory (异步)加载  内存:未压缩的资源包大小
性能:没有额外的处理过程
内存:LZ4高压缩资源包的大小
性能:没有额外的处理过程
内存:没有额外内存占用
性能:从磁盘读取的过程
LoadFromFile(异步)加载 内存:没有额外内存占用
性能:从磁盘读取的过程
内存:没有额外内存占用
性能:从磁盘读取的过程
内存:LZ4压缩包的大小
性能:从磁盘读取+LZMA解压+LZ4压缩 的过程
WebRequest (也需要缓存)加载  内存:未压缩的资源包大小
性能:没有额外处理过程[+如果缓存则从磁盘中读取的过程]
 内存:LZ4高压缩包的大小
性能:没有额外处理过程[+如果缓存则从磁盘中读取的过程]
内存:LZ4压缩包的大小
性能:当下载的时候,LZMA解压过程+LZ4压缩过程[+如果缓存则从磁盘中读取的过程]

*当使用WWW方式下载资源包的时候,WebRequest还有一个8*64kb的叠加缓存用来保存来自Socket的数据

总结——在游戏里使用低级加载的API时,有以下建议:

1、把资源包部署在StreamingAssets中——用BuildAssetBundleOptions.ChunkBasedCompression方式打包并用AssetBundle.LoadFromFileAsync来加载它,这提供了数据压缩和最快加载的性能,并且内存开销等于读取缓冲器。
2、下载资源包时,使用默认的打包选项(LZMA压缩),并且用LoadFromCacheOrDownload/WebRequest来下载和缓存它。这样为了进一步加载,会有最好的压缩比和AssetBundle.LoadFromFile加载性能。
3、加密包——使用BuildAssetBundleOptions.ChunkBasedCompression选项打包,并且用LoadFromMemoryAsync加载。(这基本是唯一使用LoadFromMemoryAsync加载的情况)
4、自定义压缩——使用BuildAssetBundleOptions.UncompressedAssetBundle选项来打包,并且在用自定义的压缩方式解压资源包后,使用AssetBundle.LoadFromFileAsync来加载。
 

AssetBundle压缩/内部结构/下载和加载的更多相关文章

  1. Unity 打AssetBundle和加载方案

    一.如何组织assetBundle: unity5以前,打包需要自己去找依赖,然后需要按照拓扑图顺序压入AB栈,这样在最后打AB时才能有效利用依赖(栈内已有的AB才能作为依赖). unity5.x后, ...

  2. Unity最新版打包AssetBundle和加载的方法

    一.设置assetBundleName二.构建AssetBundle包三.上传AssetBundle到服务器四.把AssetBundle放到本地五.操作AssetBundle六.完整例子七.Asset ...

  3. unity创建和加载AssetBundle

    先说一下为什么要使用AssetBundle吧,以前做东西一直忽略这个问题,现在认为这个步骤很重要,代码是次要的,决策和为什么这样搞才是关键. 一句话概括吧,AssetBundle实现了资源与服务分离, ...

  4. Unity热更新学习(一) —— AssetBundle 打包和加载

    理论不多说,网上,官方文档都有.  这里有一篇介绍很全面的文章:https://www.cnblogs.com/ybgame/p/3973177.html 示例和注意点记录一下,用到时以便查阅. 一. ...

  5. AssetBundle资源打包与加载

    AssetBundle资源打包  1.AssetLabels资源标签 文件名:资源打包成AssetBundle后的文件名,类似于压缩包的名字 后缀:自定义 文件名和后缀名都是小写格式(大写会自动转为小 ...

  6. 前端性能和加载体验优化实践(附:PWA、离线包、内存优化、预渲染)

    一.背景:页面为何会卡? 1.1 等待时间长(性能) 项目本身包/第三方脚本比较大. JavaScript 执行阻塞页面加载. 图片体积大且多. 特别是对于首屏资源加载中的白屏时间,用户等待的时间就越 ...

  7. Bitmap那些事之内存占用计算和加载注意事项

    前言:本来我是做电视应用的,但是因为公司要出手机,人员紧张,所以就抽调我去支援一下,谁叫俺是雷锋呢!我做的一个功能就是处理手机中的应用ICON,处理无非就是美化一下,重新与底板进行合成和裁剪,用到了很 ...

  8. Kettle实现数据抽取、转换、装入和加载数据-数据转移ETL工具

    原文地址:http://www.xue51.com/soft/5341.html Kettle是来自国外的一款开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,绿色无需 ...

  9. [转]QT4.8.5+qt-vs-addin-1.1.11+VS2010安装配置和QT工程的新建和加载

    1.下载windows下的QT库 QT4.8.5 for vs2010: http://download.qt-project.org/official_releases/qt/4.8/4.8.5/q ...

随机推荐

  1. 通过Python实现一个文档的半自动录入工具

    需求出现/使用场景: 因为公司需要将word办的接口文档在线化,看起来是个很好的事情,但是就是苦逼了我们这些干活的,其中工程量最大的就是参数的录入,要是参数少也罢,有的接口动辄三四十个参数,更甚八九十 ...

  2. python统计磁盘使用情况

    #coding:utf-8import os; def SortList(item):    return item[1]; def ReadSize(fileName):    return flo ...

  3. NSPredicate的使用

    简述 NSPredicate谓词条件过滤器,一般用于过滤数组数据,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取. 常用函数 创建谓词 + (NSPredicate *)predic ...

  4. 【转】Spring Boot干货系列:(六)静态资源和拦截器处理

    前言 本章我们来介绍下SpringBoot对静态资源的支持以及很重要的一个类WebMvcConfigurerAdapter. 正文 前面章节我们也有简单介绍过SpringBoot中对静态资源的默认支持 ...

  5. Google免费GPU使用教程(Google Colab Colaboratory)

    参考: https://www.234du.com/1154.html https://mp.weixin.qq.com/s/TGTToLYSQJui94-bQC4HIQ 注册gmail时遇到手机号无 ...

  6. 【转】打包2个10g文件 测试

    微博上kevin_prajna提了一个问题:“求Linux下一打包工具,需求:能把两个10G的文件打包成一个文件,时间在1分钟之内能接受!”. 暂且作答一下吧.首先问题是求解工具,那么我们忽略IO问题 ...

  7. Week4:Neural Networks难点记录

    为什么θ的维度是Sj+1*(Sj+1)? 课堂PPT没有两层单元个数不同的状态,故举一个例子就知道了 and sj+1=4, so sj+1×(sj+1)=4×3. 编程作业: Multi-class ...

  8. 1550: Simple String (做得少的思维题,两个字符串能否组成另外一个字符串问题)

    1550: Simple String Submit Page    Summary    Time Limit: 1 Sec     Memory Limit: 256 Mb     Submitt ...

  9. OpenGL 混合功能

    一.概念:简言之,即在颜色缓存区和深度缓存区中,新旧颜色的覆盖和替换问题:已经存在于缓存区的为目标颜色,即将进入缓存区的为源颜色: 二.应用场景:在不透明的图形前绘制一个透明的图形: 三.主要代码实现 ...

  10. Kotlin安卓页面本地存储数据(方法和封装)

    直接上代码 封装: //存储key对应的数据 fun saveData(context: Activity, key: String, info: String) { val sharedPrefer ...