Unity AssetBundle学习笔记

news2024/11/18 5:26:46

目录

基础介绍

动态资源加载

更新和添加内容

打包策略

资源分组

频繁更新的资源

资源压缩

Unload(true)和Unload(false)

Unload(false)

Unload(true)

确定何时卸载

引用计数

场景和状态管理

资源使用频率

内存预算和监控

用户输入和游戏逻辑

处理依赖关系

 依赖管理

使用 AssetBundle Manifest

减少资源依赖的资源管理实战案例

内存占用查看

版本更新处理


基础介绍

Unity 中的 AssetBundles 是一种用于存储和加载各种资源的打包机制。它们允许开发者将游戏资源(如场景、模型、纹理、声音等)打包成一个或多个文件,这些文件可以在游戏运行时动态加载。AssetBundles 主要用于优化资源的管理和减少应用的初始下载大小。

核心概念

  1. 资源打包:AssetBundles 允许将不同的资源打包成一个集合,方便统一管理和加载。

  2. 按需加载:资源可以在需要时动态加载,而不是一开始就加载所有资源,这有助于减少内存使用和启动时间。

  3. 资源更新:使用 AssetBundles 可以在不发布新版本的情况下更新游戏内容,适用于动态内容更新和热更新。

  4. 跨平台:AssetBundles 可以针对不同的平台进行优化和打包,确保资源在各平台上以最优方式使用。

性能优化

  • 减少包大小:合理组织和分配资源到AssetBundles中,以减少每个包的大小。
  • 按需加载:只在需要时加载特定的AssetBundle,避免不必要的内存占用。
  • 缓存管理:合理管理缓存的AssetBundles,以避免重复下载。

注意事项

  • 依赖管理:处理好资源间的依赖关系,避免重复包含相同的资源。
  • 版本控制:在更新AssetBundle时,确保版本兼容性,避免引起错误。
  • 内存管理:注意AssetBundle的内存使用,特别是在移动设备上。

实践应用

  • 动态内容加载:游戏可以动态加载新的关卡、角色、皮肤等,而无需重新下载整个游戏。
  • 热更新和远程资源:AssetBundles 可以从远程服务器下载,实现游戏内容的热更新。

使用 AssetBundles 可以在不发布新游戏版本的情况下更新游戏内容。

动态资源加载

  1. 资源分离:在使用 AssetBundles 时,游戏的资源不是直接嵌入在游戏的主安装包中,而是被打包成一个或多个独立的 AssetBundle 文件。

  2. 远程托管:这些 AssetBundle 文件可以被托管在远程服务器上,而不是用户的设备上。

  3. 按需下载:游戏可以根据需要从远程服务器下载这些 AssetBundle 文件。例如,当玩家进入一个新的游戏关卡时,游戏可以下载包含该关卡资源的 AssetBundle。

更新和添加内容

  1. 更新资源:开发者可以更新服务器上的 AssetBundle 文件,比如修复一个纹理,添加新的声音效果,或者改进一个模型。当游戏下次请求这个 AssetBundle 时,会获取到更新后的版本。

  2. 添加新内容:同样,开发者可以在服务器上添加全新的 AssetBundle 文件来增加游戏内容,比如新的关卡、角色或道具。

  3. 动态加载:当这些更新的或新添加的 AssetBundles 被下载到用户设备上后,游戏可以动态加载这些资源,实现内容的更新或添加。

优势

  • 减少下载大小:初始游戏安装包可以更小,因为不需要包含所有资源。
  • 减少更新频率:减少需要通过应用商店发布的完整游戏更新的频率。
  • 灵活性:允许更加灵活地管理游戏内容和推出新内容。

实际应用

  • 热更新:常用于游戏的热更新,允许快速修复错误或调整游戏平衡。
  • 活动和季节性内容:方便地为游戏添加特殊活动或季节性内容。

打包策略

资源分组

  • 按类别分组:将相似类型的资源分组打包,如将所有纹理放在一个 AssetBundle,所有模型放在另一个。
  • 按用途分组:根据资源在游戏中的使用情景进行分组。例如,一个游戏关卡的所有资源可以打包在一个 AssetBundle 中。

频繁更新的资源

  • 单独打包:将可能会经常更新的资源单独打包,以便在不影响其他内容的情况下更新它们。

资源压缩

  • 选择合适的压缩格式:根据资源类型和平台需求选择合适的压缩格式,以减少 AssetBundle 的大小。

Unload(true)和Unload(false)

Unload(false)

当调用 Unload(false) 时,Unity 会卸载 AssetBundle 对象本身,但不会卸载通过该 AssetBundle 加载进来的任何对象(如纹理、模型、预制件等)。这意味着:

  • 内存保留:已加载的资源(例如通过 AssetBundle 加载的游戏对象和纹理)会保留在内存中。
  • AssetBundle 对象卸载:AssetBundle 的引用被清除,意味着不能再从这个 AssetBundle 加载新的资源。

这种卸载方式适用于那些需要保留已加载资源的场景,例如,如果你已经使用 AssetBundle 中的资源创建了游戏对象,并且希望这些对象在卸载 AssetBundle 后仍然可用。

Unload(true)

调用 Unload(true) 时,Unity 不仅卸载 AssetBundle 对象,还会卸载所有通过该 AssetBundle 加载并实例化的资源。这包括:

  • 内存释放:通过该 AssetBundle 加载的所有资源都将从内存中卸载。
  • 资源不再可用:之前从这个 AssetBundle 加载的所有对象将不再可用,并且如果这些对象还在场景中,它们可能会停止工作或显示为丢失状态。

这种卸载方式适用于需要完全清理资源的情况,例如,当玩家离开某个游戏关卡并且不再需要该关卡资源时。

确定何时卸载

怎么确定什么时候AB包的资源不用了,什么时候进行卸载,使用什么算法

引用计数

引用计数是一种常见方法,用于跟踪资源被多少个对象或系统所引用:

  • 增加引用:当一个对象开始使用某个资源时,该资源的引用计数增加。
  • 减少引用:当对象不再使用该资源时,引用计数减少。
  • 判断卸载:当资源的引用计数降到零时,可以安全地卸载该资源。

场景和状态管理

基于游戏的当前状态或场景来管理资源:

  • 按场景卸载:在场景切换时卸载特定场景相关的资源。
  • 状态机:使用状态机来管理游戏状态,根据不同状态加载和卸载资源。

资源使用频率

分析资源的使用频率和最近使用时间:

  • LRU(Least Recently Used)算法:定期检查资源的最近使用时间,如果某个资源在一定时间内未被使用,则将其标记为可卸载。
  • 使用频率:跟踪资源使用的频率,低频使用的资源可以被优先考虑卸载。

内存预算和监控

设定内存预算并监控实际使用情况:

  • 内存限制:为资源设定内存预算。当接近或超过预算时,开始卸载最不常用的资源。
  • 性能监控:实时监控应用的内存使用情况,当内存使用达到某个阈值时触发资源清理。

用户输入和游戏逻辑

根据用户行为或游戏逻辑来决定资源的加载和卸载:

  • 用户操作:用户进入或退出某个游戏模块时,加载或卸载相关资源。
  • 游戏进度:根据游戏进度和玩家成就来动态管理资源。

处理依赖关系

 依赖管理

  • 处理依赖关系:Unity 允许自动处理 AssetBundle 间的依赖关系。如果一个 AssetBundle 依赖于另一个,则加载时必须先加载它所依赖的那个。
  • 避免重复包含:确保不会有重复资源在多个 AssetBundle 中出现,以减少冗余。

使用 AssetBundle Manifest

  • 生成和使用 Manifest:当你在 Unity 中构建 AssetBundles 时,Unity 会自动生成一个名为 "Manifest" 的文件,其中包含了所有 AssetBundles 及其依赖关系的信息。
  • 读取依赖:在加载任何 AssetBundle 之前,首先加载其 Manifest 文件,并使用它来了解该 AssetBundle 所有的依赖。
  • 按顺序加载依赖:根据 Manifest 提供的信息,先加载所有依赖的 AssetBundles,然后加载目标 AssetBundle。

如果两个包中含有重复的资源,可以将这部分重复的资源单独打成一个包:

点击Move duplicate to new bundle

此时两个原来的包就会依赖于这个新包了

不过依赖关系一般不建议超过三层

将所有角色打包在一个大包里好还是每个角色单独分包好呢?

后者好,因为一方面更新单个角色时可以只更新那一部分,

而且加载小的资源包所花的时间也更短

如果是多个角色打在一个包里,那在加密和解密的时候,需要把其他角色相关的资源也进行解密才能加载出该包,这样也费时间。

unity中 一个AB包只能被加载一次,为了适应这种规则,必须记录哪些包是被加载过的

例如改成下面这样:

减少资源依赖的资源管理实战案例

当游戏中的场景资源依赖于UI和人物资源时,如何管理?

教学源自:06实战!分离依赖和加载(人物,UI)包_哔哩哔哩_bilibili

  1. 减少资源依赖

    • 首先场景直接依赖了UI资源和人物资源包。
    • 采取的策略是将 UI 也划分到一个单独的包中,并为其创建一个专门的目录和 AssetBundle。
  2. 处理人物资源的加载

    • 为了去除场景对人物资源的直接依赖,比如提到使用胶囊体来代表人物位置,并配置生成信息。
    • 通过编辑组件参数来动态生成所需内容,如角色和模型信息。
    • 目的是减少场景与人物资源的直接依赖,通过动态配置和实例化来加载人物。

为了减少场景对人物的依赖,将其替换为胶囊体

分离场景和UI的依赖

  • 删除场景中的UI元素,创建专门的加载对象(Canvas loader)来管理UI加载。
  • 目的是进一步解耦场景和UI的直接依赖关系。

重构资源加载接口

原有的UI资源是存放在Resources下并调用相关的api进行加载的,现在将其打包在AB包里,因此需要对相应的接口做一些重构:

  • 将UI使用的资源从 Resources 文件夹移出,并重新部署这些资源。
  • 修改原有基于 Resources 的资源加载接口,改为从新的加载框架加载。
  • 目的是从 Resources 文件夹中完全解脱出来,改进资源加载机制。

图中内容就是将UI相关的资源往外移

内存占用查看

首先创建场景时勾选下面两个选项

在运行后,按下ctrl+7可以打开profiler

当使用了LoadFile的时候,就会将文件加载出来放在内存中

此时就可以在工具里查看内存的使用情况

simple模式下可以看各类资源的使用情况

detailed模式下可以看到AB包下的每个资源分别占用了多少的内存:

版本更新处理

首先比较服务器上最新的版本号,判断版本号是否一致

如果不一致则进行更新。

在比较文件时往往是只比较配置文件的md5值而不是比较一个一个文件的md5值,原因如下

比较配置文件的 MD5 码是一种实现增量更新的有效方法之一。这是因为配置文件通常相对较小,而且更容易比较和更新。

下面是一种使用配置文件的 MD5 码来实现增量更新的基本步骤:

  1. 生成配置文件的 MD5 哈希值:在每次更新前,生成当前配置文件的 MD5 哈希值,并将其存储在服务器上。

  2. 客户端请求服务器上的配置文件 MD5 值:在游戏启动或定期检查更新时,客户端会向服务器请求最新的配置文件的 MD5 值。

  3. 服务器比较 MD5 值:服务器将客户端请求的 MD5 值与服务器上存储的当前配置文件的 MD5 值进行比较。

  4. 确定是否需要更新:如果客户端的 MD5 值与服务器上的不匹配,那么说明配置文件已经发生了变化,客户端需要下载新的配置文件。

  5. 客户端下载并应用新的配置文件:客户端从服务器下载新的配置文件,并用它替

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

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

相关文章

信号与线性系统翻转课堂笔记12——时域取样定理

信号与线性系统翻转课堂笔记12 The Flipped Classroom12 of Signals and Linear Systems 对应教材:《信号与线性系统分析(第五版)》高等教育出版社,吴大正著 一、要点 (1)了解信号取样的概念&#xff1…

[Linux] MySQL数据库的备份与恢复

一、数据库备份的分类和备份策略 1.1 数据库备份的分类 1)物理备份 物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份。 物理备份方法: 冷备份(脱机备份) :是在关闭数据库的时候进…

【教学类-42-04】20231225 X-Y 之间减法题判断题(确保错误题有绝对错误的答案)

作品展示: 背景需求: 做过X-Y 之间减法题判断题,同样的方法做一份减法题 代码展示——乱序 # 乱序版(幼儿操作,题目打乱)) X-Y 之间的所有减法题的判断题3.0(随机生成绝对错误答案…

SpringBoot3 Web开发

注:SpringBoot的Web开发能力,由SpringMVC提供。 0. WebMvcAutoConfiguration原理 1. 生效条件 AutoConfiguration(after { DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,ValidationAutoConfiguration.class }) …

PAT 乙级 1030 完美数列

解题思路:这道题首先需要排序,然后双循环找出最大的那个,但一定要注意优化,比如我已经刚好找到临界,或者之后的不用遍历了没意义了,要赶紧跳出循环,否则会超时,另外其实这题还有个范围的坑过&am…

测试服务器带宽(ubuntu)

apt install python3 python3-pippip3 install speedtest-clispeestest-cli

【三维生成】稀疏重建、Image-to-3D方法(汇总)

系列文章目录 总结一下近5年的三维生成算法,持续更新 文章目录 系列文章目录一、LRM:单图像的大模型重建(2023)摘要1.前言2.Method3.实验 二、SSDNeRF:单阶段Diffusion NeRF的三维生成和重建(ICCV 2023&am…

策略模式(组件协作)

策略模式(组件协作) 链接:策略模式实例代码 注解 目的 正常情况下,一个类/对象中会包含其所有可能会使用的内外方法,但是一般情况下,这些常使用的类都是由不同的父类继承、组合得来的,来实现…

Upload上传图片,回显图片,编辑图片,限制图片,不显示上传图标,图片放大功能

效果图: 新增、编辑时:限制上传四张,当超过四张隐藏上传图标 图片放大 :效果图 详情:回显时不显示上传图标 页面:template 部分 图片在前端存储,提交时一并给后端 :file-list"repairPlan…

Biotech - 小分子化合物、蛋白质、核酸的不同数据表征方式

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/135247719 小分子化合物、蛋白质、核酸之间的关联是生命科学研究的一个重要领域,涉及到细胞功能的调控、信号传导的机制、疾病的发生和…

html table+css实现可编辑表格

要实现可编辑的 HTML 表格&#xff0c;你可以使用 JavaScript 和 HTML5 的 contenteditable 属性。 <!DOCTYPE html> <html> <head><style>table {border-collapse: collapse;width: 100%;}th, td {border: 1px solid black;padding: 8px;text-align:…

模型树实操

很多时候&#xff0c;数据都是有层级和分类的&#xff0c;使用laravel的Dcat框架&#xff0c;可以快速搭建一个结构清晰、且可以鼠标拖拽排序的后台&#xff1b;先上例子更直观&#xff1a; 这里是Dcat的模型树使用文档&#xff0c;戳一下&#xff1b; 重点注意事项有&#x…

如何给已分区的磁盘增加空间?详细教程分享!

用户案例&#xff1a;​给已分区的磁盘增加空间 “怎样给已分区的磁盘增加空间呢&#xff1f;我的电脑硬盘分成了C、D、E、F这四个区&#xff0c;每个区都是114G。但现在我觉得C盘的114G空间有些太小了&#xff0c;所以想把其他分区多余的空间给C盘。压缩完分区后&#xff0…

一款能封堵牙本质小管的牙膏,帮你告别牙齿敏感

冬天来临&#xff0c;牙齿敏感成为了很多人的困扰。吃冷饮、涮火锅都让人倍感不适&#xff0c;这时候一款有效的牙膏就显得格外重要。最近我发现了一款非常不错的清九野小红盾牙膏&#xff0c;它能够有效缓解牙齿敏感问题。 造成“敏感牙”的原因有很多&#xff0c;但根本原因还…

Vue3-26-路由-useRouter 和 useRoute 两个API 的作用介绍

先来说说两个API 的作用 useRouter() : 返回的是项目中的 路由实例的对象 可以通过这个实例对象进行路由的逻辑跳转 useRoute() : 返回的是当前的 路由对象&#xff0c; 可以在当前路由对象中获取到路由名称、路由参数、路由路径等玩完整的路由信息。 写个案例看一下具体是什么…

利用Milvus Cloud和LangChain构建机器人:一种引人入胜且通俗易懂的方法

一、引言 机器人已经深入我们的日常生活&#xff0c;从家庭服务到工业生产&#xff0c;再到医疗和运输等领域。然而&#xff0c;这些机器人往往需要复杂的算法和数据处理技术才能有效地执行任务。在这个过程中&#xff0c;人工智能&#xff08;AI&#xff09;和机器学习&#…

CTFshow-pwn入门-栈溢出pwn39-pwn40

pwn39 首先我们还是先将二级制文件托到虚拟机里面查看文件的保护信息。 chmod x pwn checksec pwn文件依然是只开启了栈不可执行&#xff0c;canary和pie都没开。并且该文件是32位的&#xff0c;那我们就托到ida32中反编译一下吧。 int __cdecl main(int argc, const char **…

k8s的二进制部署: 源码包部署-----node节点部署

服务器IP软件包k8s--master0120.0.0.61kube-aplserver&#xff0c;kube-controer-manager&#xff0c;kube-scheduler&#xff0c;etcdk8s--master0220.0.0.62kube-controer-manager&#xff0c;kube-schedulernode节点0120.0.0.62kubelet&#xff0c;kube-proxy&#xff0c;et…

Duboo-入门到学废【上篇】

目录 1&#x1f95e;.什么是duboo 2&#x1f32d;.架构图 3.&#x1f37f;快速入门 4.&#x1f9c7;浅浅理解 1.什么是duboo&#x1f936;&#x1f936;&#x1f936; Dubbo是一个由阿里巴巴开发的基于Java的开源RPC框架。它提供了高性能、透明化的远程方法调用&#xff0…

模型的线性化与离散化方法

模型的线性化与离散化方法 一、线性化——泰勒展开 对于非线性系统&#xff1a; 将一个非线性系统转换为线性系统&#xff0c;泰勒展开公式&#xff1a; 由于我们 线性化 的需求&#xff0c;只取前两项即可&#xff1a; 二、离散化——欧拉法