Unity 资源管理方案(Resources、AssetDatabase、AssetBundle、Addressable)

文章目录

  • 0.参考文章
  • 1.什么是资源管理
    • 1.1 资源管理文件
    • 1.2 资源管理目标
    • 1.3 资源管理内容
  • 2.资源管理方案
    • 2.1 直接引用
    • 2.2 Resources
    • 2.3 AssetDatabase
      • 2.3.1 官方API
      • 2.3.2 AssetDatabase的工作原理
    • 2.4 AssetBundle
    • 2.5 Addressable

0.参考文章

本文参考:https://zhuanlan.zhihu.com/p/635796583

1.什么是资源管理

在Unity中,资源管理是指资源管理和处理游戏中使用的各种资源文件的过程。

1.1 资源管理文件

资源文件可以包括:模型网格、纹理、材质、预制体、音频、动画等。

1.2 资源管理目标

确保在游戏运行时,只加载和保留游戏场景中必要的资源,并在资源不再使用时及时释放,以优化游戏的性能和内存占用

1.3 资源管理内容

  • 资源的组织和存储:资源文件通常被组织在Assets文件夹内,可以使用文件夹结构来管理资源的层级关系和分类,资源文件夹结构包括采用横向和纵向两种分类方式,以及二者混合的方式。
  • 资源的加载和卸载:根据游戏的需要,在适当的时机加载所需的资源文件,并在资源不再被使用时进行卸载(Unity在运行时Assets目录下的资源并没有被Unity加载进内存,只有场景中使用到的资源才会被加载进内存)。
  • 资源的引用计数:这是一种自动释放资源的管理方案,当资源被加载时,为该资源添加引用计数器,每当有游戏对象使用该资源就会增加计数,当计数为零时,表示资源不再被使用,系统会自动从内存中释放该资源。
  • 资源的缓存和重用:这是一种资源使用的优化方案,资源加载和释放是一项昂贵的开销,如果一个资源频繁的被加载和释放会加重系统的负担,同时也降低了游戏的性能,因此合理的资源缓存方案也是资源管理的重要内容。
  • 资源的优化和压缩:这也是一种资源使用的优化方案。对于不同的配置或不同的场景,对资源的精确度要求往往也是不同,资源管理器还需要根据不同的场景对资源进行不同等级的优化和压缩。

2.资源管理方案

2.1 直接引用

直接引用就是将资源手动拖拽到使用该资源的游戏对象的组件上。通过这种方式,该组件就通过成员变量的实例对象来引用该资源,这些被引用资源的引用路径或者GUID将保存在与场景关联的单独文件中,比如场景文件(.unity)或者预制体文件(.prefab)。简单来说,直接引用就是将资源与场景或预制体直接关联。直接引用的资源文件也会随着场景的加载或者预制体的创建而加载进内存中。
直接引用的资源无法实现动态加载和释放,而且也无法对资源压缩,性能较差的设备加载和运行时的负担过重,因此并不适用于所有设备。

2.2 Resources

Unity提供了Resource API来加载和管理内存中的资源。Resource API可以识别Assets目录及其子目录下所有名称为 Resources 的文件夹。当Resource API找到目标资源时,将它们捆绑到与应用程序一起打包的序列化文件中,其中包含元数据和索引信息。具体来说,Resource API的工作原理如下:
(1) 资源定位:Resource API在运行时会遍历Assets目录及其子目录下名为“Resources”的文件夹,然后通过路径字符串进行资源定位(路径字符串是相对于Resources文件夹的相对路径,不包含文件拓展名,比如,如果路径是"Textures/MyTexture",则表示在"Resources/Textures"文件夹中寻找名为"MyTexture"的资源)。
(2) 资源打包:一旦找到匹配的资源文件,Resource API会将资源文件及其元数据打包到一个序列化文件中。这个序列化文件包含了资源的实际数据以及其他描述信息,如资源类型、引用关系等。
(3) 资源加载:当资源被加载时,Resource API会读取序列化文件,将资源的实际数据加载到内存中。
然而也正是由于Resource API仅加载位于Resources目录中的资源这一限制,意味着Resource API并不支持打空包,意味着在使用Resource API时,无法将项目构建为没有任何资源的空包。Resource API的设计初衷是为了提供一种简单而方便的资源加载方式,通过将资源文件直接打包到应用程序中,以便在运行时能够快速访问和使用这些资源。因此,Unity在构建过程中会将"Resources"文件夹中的资源打包到应用程序中。因此应用程序会变得冗余,从而降低游戏运行时的性能。因此Unity在后续的资源管理方案设计中,着重考虑了“动态加载”的设计思路,即需要的时候再加载,而不是一次性将资源全部加载到应用程序中。

2.3 AssetDatabase

注意!!!AssetDatabase仅在Unity编辑器模式下使用,当构建游戏时请使用其他资源管理方案!!!

AssetDatabase是UnityEditor资源管理类,它提供了在Unity的Assets目录及其子目录下查找、加载已有的资源,还允许用户创建、删除、修改资源。相较于Resource来管理资源,AssetDatabase的优势包括以下几点。
(1) 灵活性和组织性:AssetDatabase提供了更灵活和组织性更强的资源管理方式。通过AssetDatabase,您可以在项目中自由地组织和管理资源文件的文件夹结构,以便更好地组织和定位资源。而Resource文件夹只提供了一个默认的资源文件夹(Assets/Resorces文件夹),资源文件的组织和管理相对较为有限。通过在Assets目录下组织资源文件的文件夹结构,Unity会自动管理和跟踪资源文件的变化,并与相应的.meta文件关联。这使得资源文件可以在Unity编辑器中可视化地管理、编辑和加载。需要注意的是,除了Assets目录外,用户不能直接将其他目录设置为AssetDatabase的资源目录。
(2) 运行时加载:使用AssetDatabase允许用户在运行时动态加载和卸载资源。用户可以根据需要按需加载资源,减少内存占用和加载时间。而使用Resource方式加载资源,资源文件需要事先打包到应用程序中,无法动态加载和卸载。
(3) 打空包:这是放弃使用Resource转而使用AssetDatabase最重要的原因。

2.3.1 官方API

https://docs.unity.cn/cn/2019.4/ScriptReference/AssetDatabase.html

2.3.2 AssetDatabase的工作原理

AssetDatabase的工作原理主要基于Unity的资源管理系统和.meta文件的机制。具体来说当用户将资源文件放置在Unity项目的Assets目录下时,Unity会自动识别这些资源文件,它会检查文件的拓展名,并根据拓展名标记为对应的资源类型。每个资源都会生成一个对应的.meta文件。,meta文件是一个文本文件,记录了资源的元数据信息、GUID以及其他相关的信息。.meta文件与资源文件一一对应,具有与资源文件相同的文件名,Unity通过.meta文件来跟踪资源文件的状态和属性。
AssetDatabase利用Unity的这个机制维护了一个资源数据库,用来存储资源文件及其.meta文件。资源数据库是一个内部的数据结构,记录了资源文件的路径、GUID、类型以及其他属性。
通过对资源数据库传入资源路径或GUID,AssetDatabase的API可以实现对资源的查找、加载、创建、删除等操作。
当用户修改资源文件时,AssetDatabase会自动更新资源数据库和相关的.meta文件。

2.4 AssetBundle

参考博文:https://editor.csdn.net/md/?articleId=139528401

2.5 Addressable

参考博文:https://blog.csdn.net/linxinfa/article/details/122390621

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

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

相关文章

【Python实战因果推断】29_倾向分9

目录 Outcome Is Easy to Model Generalized Propensity Score for Continuous Treatment Outcome Is Easy to Model 在下一个简单而又能说明问题的例子中,复杂性在于 而不是 。注意 中的非线性,而结果函数是简单的线性。在这里,真正的 A…

【操作系统】进程管理——调度算法(个人笔记)

学习日期:2024.7.4 内容摘要:各种调度算法的思想、规则、优缺点介绍 为什么要有调度算法? 调度算法就好比一群人在银行办理业务,准备办理业务的人就是进程/作业,银行窗口的工作人员就是CPU,进程往往是比C…

xcode配置swift使用自定义主题颜色或者使用RGB或者HEX颜色

要想在xcode中使用自定义颜色或者配置主题色,需要在Assets中配置,打开Assets文件,然后点击添加Color Set: 输入颜色的名称,然后选中这个颜色,会出现两个颜色: Any Appearance表示亮色模式下使用…

评估测试用例有效性 5个方面

评估测试用例的有效性是确保软件测试活动能够达到预期目标的关键步骤,有助于测试团队优化测试计划,提高测试效率,减少返工,节省成本。如果缺乏对测试用例的有效性评估,可能会导致测试用例无法覆盖关键功能点&#xff0…

SpringCloud代码实战

项目结构 实例实现功能:实现通过id查询用户的订单信息 OrderCommon:公共的一些模块类型,此处为一个user对象 Eureka-Service:配置Eureka的启动类,服务端 Order-Service:提供查询功能的服务端 Order-Client:查询的客户端 OrderCommon代码…

ps导入图片的方式

在Photoshop(简称PS)中导入图片是一项基础且常用的操作,无论是进行图像处理、设计创作还是编辑照片,这一步骤都至关重要。下面将详细介绍几种在Photoshop中导入图片的方法,帮助你快速上手。 方法一:通过菜…

智汇园区:为园区企业注入前沿技术与人才活力

在日新月异的时代浪潮中,树莓集团深知人才是企业发展的核心驱动力,更是推动产业升级与创新的关键要素。因此,我们致力于构建全方位的人才引进与培养体系,为园区企业输送源源不断的前沿技术与人才支持。 【人才引进:汇聚…

私活必备框架!终于找到一个前后端都有的后台管理系统了~

大家好,我是「程序视点」爱分享的小二哥~ 今天介绍一个新的Vue后台管理框架,相比其他后台功能丰富管理系统,这个后台管理系统可以用干净简洁来形容——Nova-admin Nova-admin Nova-admin 是一个基于Vue3、Vite5等最新技术的后台管理平台。用…

Selenium 中的 JUnit 注解

JUnit 是一个基于 Java 的开源框架,可帮助测试人员执行单元测试。JUnit 主要用于测试应用程序的每个单元或组件,例如类和方法。它有助于编写和运行可重复的自动化测试,以确保项目代码按预期运行。还可以使用 JUnit 执行 Selenium 自动化测试用…

【ESP32】打造全网最强esp-idf基础教程——16.SmartConfig一键配网

SmartConfig一键配网 一、SmartConfig知识扫盲 在讲STA课程的时候,我们用的是代码里面固定的SSID和密码去连接热点,但实际应用中不可能这么弄,我们得有办法把家里的WiFi SSID和密码输入到设备里面去,对于带屏带输入设备还…

C# —— Directory类

Directory 提供了目录以及子目录进行创建移动和列举的操作方法 Directory 和DirectoryInfo类 (主要操作文件目录属性列如文件是否隐藏的 或者只读等这些属性) 1目录的创建方法Directory 在桌面上查找该目录 Directory.CreateDirectory("C:\Users…

视频共享交换平台LntonCVS视频监控平台智慧加油站安全管理方案

加油站作为危化品行业的一部分,日常的加油和卸油作业安全至关重要。目前国内加油站的管理主要依赖于人为管控、监控摄像头和人工巡检,这些方法存在效率低下和反应滞后的问题。为了有效应对安全风险,急需引入人工智能、物联网和大数据技术&…

UE5 本地化多语言方案

导入插件: https://www.unrealengine.com/marketplace/zh-CN/product/07e1d9bd9ced444c9b2a7e232161f74d​www.unrealengine.com/marketplace/zh-CN/product/07e1d9bd9ced444c9b2a7e232161f74d 打开测试关卡 打开插件下图目录,csv文件可以添加多个&…

[PaddlePaddle飞桨] PaddleOCR图像小模型部署

PaddleOCR的GitHub项目地址 推荐环境: PaddlePaddle > 2.1.2 Python > 3.7 CUDA > 10.1 CUDNN > 7.6pip下载指令: python -m pip install paddlepaddle-gpu2.5.1 -i https://pypi.tuna.tsinghua.edu.cn/simple pip install paddleocr2.7…

网络编程:各协议头(数据报格式)

一、mac头 二、ip头 protocol——tcp/udp (7)TTL——生存时间 三、tcp头 四、udp头

dify/api/models/web.py文件中的数据表

源码位置:dify/api/models/web.py SavedMessage 表结构 字段英文名数据类型字段中文名字备注idStringUUIDIDUUID生成app_idStringUUID应用ID非空message_idStringUUID消息ID非空created_by_roleString创建者角色非空,默认值为’end_user’created_bySt…

uboot学习:(一)

目录 uboot是一个裸机程序(bootloader) 作用 要运行linux系统时,如何从外置的flash拷贝到DDR中,才能启动 uboot使用步骤 步骤1中的命令例子 注意 uboot源码获取方法 uboot是一个裸机程序(bootloader&#xff09…

校园外卖系统带万字文档在线外卖管理系统java项目java课程设计java毕业设计

文章目录 校园外卖系统一、项目演示二、项目介绍三、万字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码带万字文档(9.9¥带走) 校园外卖系统 一、项目演示 校园外卖服务系统 二、项目介绍 语言:java 数据库&…

【fastadmin 开发实战】select 级联选择

先看实现的效果 1、表单页面实现级联选择 2、级联选项后台可以编辑添加 前端代码&#xff08;编辑窗口&#xff09;&#xff1a; <div class"form-group"><label class"control-label col-xs-12 col-sm-2">{:__(渠道归属)}:</label><…

力扣之有序链表去重

删除链表中的重复元素&#xff0c;重复元素保留一个 p1 p2 1 -> 1 -> 2 -> 3 -> 3 -> null p1.val p2.val 那么删除 p2&#xff0c;注意 p1 此时保持不变 p1 p2 1 -> 2 -> 3 -> 3 -> null p1.val ! p2.val 那么 p1&#xff0c;p2 向后移动 p1 …