Unity 资源管理方案(Resources、AssetDatabase、AssetBundle、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

相关推荐

  1. Unity3D 基于YooAssets的资源管理详解

    2024-07-10 12:28:03       31 阅读
  2. Unity资源管理与热更 YooAsset+HybridCLR

    2024-07-10 12:28:03       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 12:28:03       99 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 12:28:03       107 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 12:28:03       90 阅读
  4. Python语言-面向对象

    2024-07-10 12:28:03       98 阅读

热门阅读

  1. activiti6学习

    2024-07-10 12:28:03       17 阅读
  2. Android Camera Framework:从基础到高级

    2024-07-10 12:28:03       29 阅读
  3. React Native与React Native Web:跨平台开发的新选择

    2024-07-10 12:28:03       25 阅读
  4. React Native

    2024-07-10 12:28:03       26 阅读
  5. ——探索从懵懂学童到职场人的期待与感悟

    2024-07-10 12:28:03       28 阅读
  6. ArduPilot开源代码之AP_MSP

    2024-07-10 12:28:03       31 阅读
  7. dify-on-wechat中涉及企业微信几个函数解析

    2024-07-10 12:28:03       30 阅读