Unity 资源热更新

2023/9/30 17:32:59

热更新流程

  1. 启动游戏
  2. 根据当前版本号,和平台号去版本服务器上检查是否有热更
  3. 热更服务器上下载md5文件,比对需要热更的具体文件列表
  4. 热更服务器上下载需要热更的资源,解压到热更资源目录
  5. 游戏运行加载资源,优先到热更目录中加载,再到母包资源目录加载

这些目录包含着不同版本的资源文件,以及用于版本控制的Files.txt,里面存放着资源文件的名称和md5码。

客户端版本号我们是4位来标识,假设是X.Y.Z.W

X:【巨大版本号】这一位其实就是1,没事一般不会动他,除非有太巨大的变化,目前反正还是1;
Y:【整包更新版本号】:我们游戏一般一个月会有一个比较大的版本迭代,这种版本会走商店,每次提交Y值+1;
Z:【服务器协议版本号】,一个月度版本周期内,万一SDK有问题或者C#层有发现bug,需要更新商店,这一位会+1,这里单独留一个Z处理这种商店版本号,是因为不想影响Y值,而商店提交新包要求版本号必须有增加,buildNum也是商店要求必须要升的;
W:【编译版本号\热更版本号】,每次热更都+1 。
【第2位加1之后,3、4位全部清0】

作用

相对于Resources下的资源,AB包可以更好地管理资源,更灵活方便,更易于做热更新相关工作

在这里插入图片描述

AssetBundle

AssetBundle 是一个存档文件,包含可在运行时由 Unity 加载的特定于平台的非代码资源(比如模型、纹理、预制件、音频剪辑甚至整个场景)。AssetBundle 可以表示彼此之间的依赖关系;例如,一个 AssetBundle 中的材质可以引用另一个 AssetBundle 中的纹理。

AssetBundle对于可下载内容(DLC)、减少初始安装大小、加载针对最终用户平台优化的资产以及减少运行时内存压力都很有用

AssetBundle里面包含了什么?

  • 首先是磁盘上的实际文件,这称为AssetBundle archive。AssetBundle archive是一个容器,就像一个文件夹一样,其中包含了额外的文件。这些额外的文件包括两类:
    • 序列化文件,其中包含分解为各个对象并写入此单个文件的资源。
    • 资源文件,这是为某些资源(纹理和音频)单独存储的二进制数据块,允许 Unity 高效地在另一个线程上从磁盘加载它们。
  • 也可以指:通过代码进行交互以便从特定 AssetBundle 存档加载资源的实际 AssetBundle 对象。该对象包含添加到此存档文件的资源的所有文件路径的映射

游戏资源目录

  • Resources:全部资源都会被压缩,转化成二进制。打包后该路径不存在,不可写也不可读。只能使用Resources.Load加载资源。
  • Streaming Assets:全部资源原封不动打包。在移动平台下,是只读的,不能写入数据,其他平台下可以使用System.File类进行读写。在任意平台都可以使用AssetBundle.LoadFromFile来从此文件夹读取加载ab包。

AssetBundle管理

请添加图片描述

打包资源

将需要同时加载的资源放在同一个包里,各个包之间会保存相互依赖的信息

分组依据:

  • 逻辑实体分组:是指根据资源所代表的项目功能部分将资源分配给 AssetBundle。这包括各种不同部分,比如一组角色的所有模型和动画、多个关卡之间共享的景物的纹理和模型
  • 类型分组:要构建供多个平台使用的 AssetBundle,类型分组是最佳策略之一。如果音频压缩设置在 Windows 和 Mac 平台上完全相同,则可以将所有音频数据打包到 AssetBundle 并重复使用,而着色器往往使用更多特定于平台的选项进行编译
  • 并发内容分组: 将需要同时加载和使用的资源捆绑在一起。可以将这些类型的捆绑包用于基于关卡的游戏(其中每个关卡包含完全独特的角色、纹理、音乐等)。

卸载资源

在管理Asset和AssetBundle时,最重要的一点是调用AssetBundle.unload时的方式,unload参数为true或false。

此API将卸载正在调用的AssetBundle的包头信息。unload参数决定是否也卸载从此AssetBundle实例化的所有对象。如果设置为true,那么从AssetBundle创建的所有对象也将立即卸载,即使它们目前正在活动场景中被引用。

在这里插入图片描述

如果调用了AssetBundle.Unload(True),则M将从场景中移除,销毁并卸载。但是,如果调用AssetBundle.Unload(False),则AB的包头信息将被卸载,但M将保持在场景中,并且仍然是可用的。

调用AssetBundle.Unload(False)破坏了M和AB之间的链接。如果AB稍后再次加载,则AB中包含的对象的新副本将会被加载到内存中。此后如果再次加载AB,将再次加载这个包头信息的新副本,但是M和这个包并不会重新建立连接。如果此时调用AssetBundle.LoadAsset()来重新加载M,将会有两个相同的副本M在现场。

在这里插入图片描述

为了避免这种情况,应该使用AssetBundle.Unload(True),并来确保对象不被复制,具体做法是:

  1. 在应用程序的生命周期内定义一个合适的节点,并在此期间卸载不需要的AssetBundle,例如在关卡切换或加载屏幕期间。这是最简单和最常见的选择。
  2. 维护单个对象的引用计数,并仅当所有组成对象都未使用时才卸载AssetBundle。这允许应用程序在不重复内存的情况下卸载和重新加载单个对象

另一个问题是:如果AssetBundle卸载后重新加载一个对象,重新加载将失败,该对象将以(Missing)对象的形式出现在Unity编辑器的层次结构中,材质会呈现洋红色。主要会发生在Unity失去并试图恢复对其图形上下文的控制时,例如当移动应用程序被挂起或用户锁定他们的PC时

加载AssetBundles

AssetBundles可以通过四个不同的API进行加载。但受限于两个标准,这四个API的行为是不同的。两个标准如下:

  • AssetBundles的压缩方式:LZMA、LZ4、还是未压缩的。
  • AssetBundles的加载平台。

而四个API分别是:

  • AssetBundle.LoadFromMemory(Async optional)不要使用这个API,因为他会冗余多次
  • AssetBundle.LoadFromFile(Async optional):用于从本地存储(如硬盘或SD卡)加载未压缩或LZ4压缩格式的AssetBundle。
  • UnityWebRequest's DownloadHandlerAssetBundle
  • WWW.LoadFromCacheOrDownload (on Unity 5.6 or older)

一般来说,只要有可能,就应该使用AssetBundle.LoadFromFile。这个API在速度、磁盘使用和运行时内存使用方面是最有效的。

从AssetBundles中加载Assets

Unity提供了三个不同的API从AssetBundles加载UnityEngine.Objects,这些API都绑定到AssetBundle对象上,并且这些API具有同步和异步变体,这些API的同步版本总是比异步版本快至少一个帧(因为异步版本为了确保异步,都至少延迟了1帧):

  • LoadAsset (LoadAssetAsync)
  • LoadAllAssets (LoadAllAssetsAsync)
  • LoadAssetWithSubAssets (LoadAssetWithSubAssetsAsync)

加载多个独立的UnityEngine.Objects时应使用LoadAllAsset。并且只有在需要加载AssetBundle中的大多数或所有对象时,才应该使用它。LoadAllAsset比对LoadAsset的多个单独调用略快一些

Object加载是在主线程上执行,但数据从工作线程上的存储中读取。任何不触碰Unity系统中线程敏感部分(脚本、图形)的工作都将在工作线程上转换。例如,VBO将从网格创建,纹理将被解压等等。当一个Object完成加载时,它的Awake回调将被调用,该对象的其余部分将在下一个帧中对UnityEngine可用。


http://www.jnnr.cn/a/135068.html

相关文章

【现代密码学原理】——消息认证码(学习笔记)

📖 前言:消息认证码 MAC(Message Authentication Code)是经过特定算法后产生的一小段信息,检查某段消息的完整性,以及作身份验证。它可以用来检查在消息传递过程中,其内容是否被更改过&#xff…

【保姆级】新机器部署RabbitMQ

1、登录服务器,如果非root用户则切root用户 sudo su - 2、在/usr/tmp目录上传erlang、rabbitmq安装包 3、将安装包移到/usr/local/目录 mv /usr/tmp/erlang-21.3.8.2-1.el7.x86_64.rpm /usr/local/ mv /usr/tmp/rabbitmq-server-3.7.15-1.el7.noarch.rpm /usr/lo…

股票系统接口是如何进行数据共享的?

股票系统接口系统在量化交易中常见的一种数据挖掘系统,就比如说,如果你想要从别的网站或服务器上获取资源或信息,别人是不会把数据库共享过来的,他只能给你提供一个他们写好的编程方法来获取数据。也就是说通过股票系统接口输入你…

LDO的前世今生

众所周知,开关电源的效率很高,但是输出电压有纹波,噪声很大,不能直接接入单片机控制电路中,而一般选择的方案都是在开关电源的输出端接一级LDO低压差线性稳压电源,可以保证输出到单片机中的电压很稳定&…

高通SDX12:SFE(shortcut-fe)软加速驱动效果调测

背景 USB转PHY RTL8153不支持高通IPA硬加速,所以采用SFE软加速 调试设备为基于Cat.6通信模组的整机 SFE软加速前:UXM环境实际测速100Mbps,设备内部sirq 87% SFE软加速驱动调测 SFE驱动代码路径:sdx12-ap\shortcut-fe\shortcut-fe SFE驱动编译文件路径:sdx12-ap\poky\m…

《计算机导论》课程学习笔记

目录 第一章认识计算机 1.1计算思维概述 1.2冯诺依曼体系结构 1.3计算机硬件组成 1.4计算机软件 1.5计算机操作系统 第一章认识计算机 1.1计算思维概述 1.计算思维能力概念 计算思维能力的核心是问题求解能力。 发现问题寻求解决问题的思路分析比较不同的方案验证方案…

第一个 Go 程序,从 Hello World 开始

1、开发编辑器 Go 采用的是UTF-8编码的文本文件存放源代码,理论上使用任何一款文本编辑器都可以做 Go 语言开发,这里推荐使用 VS Code 和 Goland。 VS Code 是微软开源的编辑器,而 Goland 是 jetbrains 出品的付费IDE。GoLand 开发工具时收…

HDLC协议的特点及功能,让你一看就会

一 HDLC概述 1.1 HDLC的发展历史 高级数据链路控制(High-Level Data Link Control或简称HDLC),是一个在同步网上传输数据、面向比特的数据链路层协议,它是由国际标准化组织(ISO)根据IBM公司的SDLC(SynchronousData Link Control)协议扩展开发而成的.其最…

python基础语法>>基本数据类型

一个喜欢算法的大三在校学生,每周都会将学到的知识贡献给大家。☁️💡🎈 开始之前,不妨休息一下,先看个小动画🍵,才能激情地去学习! 用python的一个小turtle画了一个简易版的图书馆 python语法大…

流程表单初体验

文章目录1. 表单分类2. 动态表单3. 启动带表单的实例4. 查询任务上的表单5. 保存与完成有小伙伴在星球上催了好几次了,今天松哥就来和大家聊一聊流程中的表单。1. 表单分类 整体上来说,我们可以将表单分为三种不同的类型: 动态表单&#xf…

linux备份mysql8.0数据库脚本

文章目录环境要求步骤1、创建一个.sh文件编写shell脚本2、添加定时任务环境要求 linux系统,安装了mysql8.0 步骤 1、创建一个.sh文件编写shell脚本 创建文件的命令: vim ***.shshell文件文件参考自文章 链接 export LANGen_US.UTF-8 #注意&#xf…

[附源码]java毕业设计流浪动物救助系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

EventBridge 生态实践:融合 SLS 构建一体化日志服务

作者: 昶风 引言 阿里云日志服务 SLS 是一款优秀的日志服务产品,提供一站式地数据采集、加工、查询与分析、可视化、告警、消费与投递等服务。对于使用 SLS 的用户业务而言,SLS 上存储的日志信息反映着业务的运行状态,通过适当地…

计算机网络-传输层(UDP协议报文格式,伪首部,UDP校验过程)

文章目录1. UDP协议UDP报文格式UDP校验过程1. UDP协议 UDP只在IP数据报服务之上增加了很少功能,即复用分用和差错检测功能。 UDP的主要特点: UDP是无连接的,减少开销和发送数据之前的时延。 UDP使用最大努力交付,即不保证可靠交付。 UDP是…

java乱码问题一次性解决

在我们编码生活中,最常见的就是乱码,我也是遇到好几次,现在我整理一下所有乱码的解决方式,可治99%乱码问题 设置文件编码属性 修改当前 Web 项目 Tomcat Server 的虚拟机输出选项 -Dfile.encodingUTF-8 IntelliJ IDEA 中自定义…

项目管理之信息文档管理与配置管理(第一篇)

目录 前言 一、软件文档的分类 1.开发文档 2.产品文档 3.管理文档 二、文档质量的四个等级 1.1级文档 2.内部文档(2级) 3.工作文档(3级文档) 4.正式文档(4级文档) 三、配置管理 1.配置管理的定义…

[附源码]Python计算机毕业设计java高校社团管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

PDPS软件:机器人控制输送带运行虚拟仿真操作方法

目录 概述 旋转台设备运动机构介绍 旋转台设备模型导入与安装 旋转台设备操作创建 机器人控制旋转台设备离线程序命令添加 仿真运行 概述 旋转台也是工业机器人生产线中常用的外围设备,工件安装在旋转台的夹紧机构上,旋转台通过旋转实现工作位置的…

图文详解Linux基础经典教程(08)——CentOS安装MySQL数据库

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 概述 之前,我们在CentOS中安装了JDK、Tomcat;接下来,我们在CentOS中采用YUM的方式安装MySQL5.6数据库。 安装前准备工作 在此&#xf…

JMeter如何自定义HTTP组件

JMeter是一个优秀的开源项目,我们可以在jmeter的官网了解到如何使用和如何二次开发:Apache JMeter - Apache JMeter™ 因工作需要,最近做了一个JMeter自定义的http组件(其实就是在http的基础上加了点东西而已)。现就该…
最新文章