在Addressable中如何为关键资源设置高优先级下载

解读

国内项目普遍把 Addressable 当“资源热更+分包”唯一方案,面试时考官真正想确认的是:

  1. 你是否理解 AssetReferenceAssetProviderResourceLocation 三条链路的优先级差异;
  2. 能否在 下载队列 里把“登录 UI、首场景、主角模型”这类关键资源插队,而不是傻等整个队列走完;
  3. 是否知道 Unity 2019 LTS 以后 官方提供的 DownloadPriority 字段以及 AsyncOperationHandlePriority 重载,而不是还在用旧版 AssetBundle.LoadFromXXX 自己写优先级;
  4. 能否在 弱网/地铁场景 下把优先级策略与 RetryTimeoutCDN 边缘节点 做联动,体现“上线意识”。

知识点

  • ResourceLocationMap 中的 Priority 字段(int,默认 0,越大越靠前)
  • AsyncOperationHandlePriority 属性(set 后实时影响 UnityWebRequest 的队列顺序)
  • Addressables.DownloadDependenciesAsyncautoReleaseHandle 参数(决定句柄是否常驻,避免高优资源被意外卸载)
  • Catalog 更新时机:高优资源必须 预打进首包首包启动后 3 秒内 完成本地缓存,否则优先级再高也会走网络
  • 平台差异:Android 的 LZ4HC 压缩 + UnityWebRequest 多线程上限 6 个,iOS 为 4 个,优先级只在 同帧发起的请求 里生效,并发数打满后 高优仍需排队
  • 监控埋点:国内发行要求把 “关键资源下载耗时” 作为 LaunchPhase 埋点上报,优先级策略直接影响 CPA 转化 数据

答案

分三步落地,代码可直接写进公司框架:

  1. 在分组里标记高优
    打开 Groups 窗口,把“登录 UI”、“主角模型”等拖到单独 Group,命名 CriticalGroup,在 Inspector 里把 Bundle Provider 设为 AssetBundleProviderPriority100(0-255,100 以上留给业务)。

  2. 首包启动时插队下载
    GameLauncher.csStart 方法里:

    // 只下载关键资源,不加载
    var handle = Addressables.DownloadDependenciesAsync("CriticalGroup", false);
    handle.Completed += op => {
        if (op.Status == AsyncOperationStatus.Succeeded)
            Addressables.Release(op);   // 下载完立即释放句柄,但资源留在缓存
    };
    // 把优先级提到最高
    handle.OperationHandle.Priority = 255;
    

    这样 UnityWebRequest 会把该组所有 AssetBundle 请求插到队首,弱网 3G 下也能保证 首屏 2 秒内 出现登录按钮。

  3. 运行时动态提升单资源优先级
    若某些资源在 战斗前 才决定使用,可运行时临时插队:

    var handle = Addressables.LoadAssetAsync<Texture2D>("BossIcon");
    handle.OperationHandle.Priority = 200;
    

    注意:句柄必须在引用计数为 0 前保持,否则优先级失效。

补充:CDN 边缘节点 必须给 CriticalGroupBundle预热,否则优先级再高也会因 404 重定向 拖慢 首包体验

拓展思考

  • 优先级饥饿:如果业务无脑把 所有资源 设成 255,等于没优先级。国内大厂做法是给 首包、活动、付费 三类资源分别设 200/100/50,并在 下载队列 里做 加权轮询,防止低优资源永远排不上。
  • 断点续传:高优资源在 地铁隧道 中断后,UnityWebRequestRange 头需手动加 ETag 校验,否则 Addressable 1.19+ 会整包重下,导致 优先级策略失效
  • Shader 变体:关键 UI 依赖 URP Shaderstencil 变体,若 ShaderBundle 优先级低于 TextureBundle,会出现 材质丢失紫块。正确做法是把 Shader 单独打组,优先级固定 255,并在 首包启动预加载并常驻内存
  • 版本回退:国内渠道 审核失败 后需要 回滚资源,此时 高优资源Catalog 必须 版本号不变 仅替换 Bundle,否则 优先级缓存 会被 清掉,导致 二次下载 击穿 月活带宽成本