Addressable-引用计数

1、什么是引用计数规则?

当通过加载使用可寻址资源时,Addressables会在内部帮助我们进行引用计数,使用资源时,引用计数+1,释放资源时,引用计数-1,当可寻址资源的引用为0时,就可以卸载它了

为了避免内存泄露(不需要使用的内容残留在内存中),我们要保证加载资源和卸载资源是配对使用的

注意:释放的资源不一定立即从内存中卸载,在卸载资源所属的AB包之前,不会释放资源使用的内存(比如自己所在的AB包 被别人使用时,这时AB包不会被卸载,所以自己还在内存中),我们可以使用Resources.UnloadUnusedAssets卸载资源(建议在切换场景时调用)

AB包也有自己的引用计数(Addressables把它也视为可寻址资源)从AB包中加载资源时,引用计数+1,从AB包中卸载资源时,引用计数-1,当AB包引用计数为0时,意味着不再使用了,这时会从内存中卸载

总结:Addressables内部会通过引用计数帮助我们管理内存,我们只需要保证 加载和卸载资源配对使用即可

2、AddressableMgr 

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using NUnit.Framework;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class AddresssablesInfo
{
    public AsyncOperationHandle handle;
    public uint count;

    public AddresssablesInfo(AsyncOperationHandle handle)
    {
        this.handle = handle;
        count += 1;
    }
}

public class AddressableMgr
{
    public static AddressableMgr instance = new AddressableMgr();
    public static AddressableMgr Instance => instance;

    // 有一个容帮助存储异步加载的返回值
    public Dictionary<string, AddresssablesInfo> resDic = new Dictionary<string, AddresssablesInfo>();
    
    private AddressableMgr() { }

    public void LoadAssetAsync<T>(string name, Action<AsyncOperationHandle<T>> callback)
    {
        // 
<think>嗯,用户想了解YooAsset和Addressable的功能、使用方法及对比。根据站内提供的引用信息,需要整理一个全面的对比。 引用[1]提到YooAsset的API更简单易用,特别适合不熟悉Addressable复杂配置的开发者。引用[2]则详细比较了资源版本管理和CDN切换的差异,这两个点需要重点展开。 用户可能是个Unity开发者,正在为项目选择资源管理系统。根据历史对话没有特别倾向性,因此要保持客观中立。 功能对比方面,考虑从核心能力、包体大小、热更新支持等维度展开。Addressable作为Unity官方方案集成度更好,但YooAsset在易用性和轻量化方面有优势。需要强调引用[2]中提到的包体差异——YooAsset比Addressable小约16字节/资源,这个技术细节值得保留。 使用方法部分需要区分API设计。Addressable的API调用链较长,比如LoadAssetAsync需要处理AsyncOperationHandle;而YooAsset的链式调用更符合直觉,这点引用[1]的"简化的API"描述很准确。 版本管理是重点差异项。Addressable通过修改InternalIdTransformFunc实现CDN切换,版本回退需要维护多份hash文件;YooAsset则直接修改版本号文件,更符合直觉。这里准备用引用[2]的代码示例说明会更清晰,但考虑用户需要文字描述,改用流程说明替代。 易用性方面准备补充配置差异。Addressable需要配置AssetGroups和Profiles,YooAsset的Package系统更轻量,这点在引用[1]的"复杂配置"描述中可以呼应。 最后要突出选型建议场景:轻度项目或用Unity原生方案时倾向YooAsset;需要深度Editor集成或跨国团队则推荐Addressable。相关问题按惯例设计三个递进问题,覆盖性能测试和工作流差异。 </think>以下是YooAsset与Unity Addressables的详细对比分析,结合功能、使用方法及核心差异: --- ### **一、核心功能对比** | **功能维度** | **Addressables** | **YooAsset** | |----------------------|--------------------------------------|---------------------------------------| | **资源打包** | 需配置AssetGroups和Profiles | 按`Package`划分资源,配置更简洁[^1] | | **资源加载** | `Addressables.LoadAssetAsync()` | `Package.LoadAssetAsync()`链式调用 | | **CDN切换** | 需修改`Addressables.InternalIdTransformFunc` | 内置`_defaultHostServer`自动切换[^2] | | **版本回退** | 需维护多版本hash表,修改下载路径 | 直接修改CDN目录的版本号文件即可[^2] | | **包体大小** | Bundle头信息较大(约16字节/资源) | 精简头信息,整体包体更小[^2] | | **资源加密** | 需自定义加密脚本 | 内置AES加密支持 | --- ### **二、使用方法示例** #### **Addressables 加载流程** ```csharp // 1. 初始化 AsyncOperationHandle initHandle = Addressables.InitializeAsync(); // 2. 加载资源 AsyncOperationHandle<GameObject> loadHandle = Addressables.LoadAssetAsync<GameObject>("AssetKey"); loadHandle.Completed += handle => { Instantiate(handle.Result); }; // 3. 释放资源 Addressables.Release(loadHandle); ``` #### **YooAsset 加载流程** ```csharp // 1. 初始化资源包 ResourcePackage package = YooAssets.CreatePackage("Default"); YooAssets.SetDefaultPackage(package); // 2. 加载资源 AssetOperationHandle handle = package.LoadAssetAsync<GameObject>("AssetPath"); handle.Completed += asset => { Instantiate(asset.AssetObject); }; // 3. 释放资源 handle.Release(); ``` > ✅ **易用性优势**:YooAsset的链式API减少回调嵌套,逻辑更直观[^1] --- ### **三、关键差异深度解析** 1. **版本管理机制** - **Addressables**:依赖`catalog.json`记录资源Hash,版本回退需重建目录结构[^2] ```bash # 目录示例 v1.0/catalog.json v2.0/catalog.json ``` - **YooAsset**:通过修改`PackageName.version`文件直接切换版本,无需重建路径[^2] 2. **热更新策略** - **Addressables**:对比远端Hash差异,增量下载变更资源 - **YooAsset**:支持差异下载(DLC)和全量更新两种模式,灵活适配场景 3. **内存管理** - **Addressables**:需手动管理`AsyncOperationHandle`生命周期 - **YooAsset**:内置引用计数机制,自动卸载零引用资源 --- ### **四、选型建议** | **场景** | **推荐方案** | **原因** | |-------------------------|--------------------|---------------------------------------| | 中小项目快速开发 | ✅ YooAsset | 配置简单,API学习成本低[^1] | | 大型团队协作 | ✅ Addressables | Unity官方支持,编辑器工具链完善 | | 频繁热更新需求 | ✅ YooAsset | 版本回退操作更敏捷[^2] | | 跨国CDN分发 | ✅ Addressables | InternalIdTransformFunc支持动态路由 | > ⚠️ **注意**:Addressables与Unity Editor深度集成,适合需要可视化配置管线的团队;YooAsset更注重轻量化与代码驱动,适合偏好纯代码管理的开发者[^1][^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值