当前位置: 首页 > news >正文

基于Unity YooAsset自动化资源管理框架,附源代码

源代码地址在最后,非常感谢你的观看

1.繁琐的内存管理,在C++时代对内存管理需要new 和 Delete相对应,Delete之后还需要把指针置空,不然会导致内存泄漏或者野指针的问题。

2.市面上普遍的资源管理采用Index计数方式管理,当计数为0的时候就会在内存不足或者特定的地方释放内存比如场景切换。

问题:Index计数方式过于繁琐,需要资源加载和释放完全对应,不然就会有内存泄漏风险。

思考:采用引用计数方式来处理内存释放,当引用数据为Null的时候,释放这个内存。

实践:

环境:Unity 2022.3.62

YooAsset版本:2.3.16

1.点击加载资源,我们可以看到YooAsset的AssrtBundle里面已经有多条加载到内存的数据:

2.我们点击卸载资源,会发现YooAsset的资源已经全部被清空了。

3.原理和核心代码,通过传入GameObject的引用,来保持资源的存活,当这个资源的GameObject的引用不存在的时候,就判定这个资源可以释放了。

 public async void LoadAssetAsync<T>(string path,GameObject refObj,Action<T> call)where T : UnityEngine.Object{AssetHandle assetHandle = _assetHelper.Package.LoadAssetAsync<T>(path);await assetHandle.Task;if (assetHandle.AssetObject == null){Debug.LogError($"资源加载错误LoadAssetAsync:{path}");return;}if (!_autoRefData.TryGetValue(path, out ResAutoRefData resAutoRefData)){resAutoRefData = new ResAutoRefData(assetHandle);_autoRefData.Add(path, resAutoRefData);}resAutoRefData.RefObj.Add(refObj);T asset = assetHandle.AssetObject as T;call?.Invoke(asset);}

4.释放资源的代码(可以看到只检测了GameObject被释放的资源):

 //释放引用计数为0的资源public async UniTask UnloadAsset(){//因为GameObject销毁是在本帧的最后阶段才会消耗,所以要等待帧结束await UniTask.WaitForEndOfFrame();_removeHandle.Clear();foreach (string path in _autoRefData.Keys){ResAutoRefData resAutoRef = _autoRefData[path];List<GameObject> refObjs = resAutoRef.RefObj;int refIndex = 0;foreach (GameObject refObj in refObjs){if (refObj != null){refIndex++;break;}}if (refIndex == 0){resAutoRef.Handle.Release();_removeHandle.Add(path);}}//移除资源的加载if (_removeHandle.Count != 0){foreach (string path in _removeHandle){_autoRefData.Remove(path);}}UnloadUnusedAssetsOperation unloadUnused = _assetHelper.Package.UnloadUnusedAssetsAsync();await unloadUnused.Task;}

源代码地址:YooAssetAutoMemory: 基于Unity YooAsset自动化资源管理框架。

http://www.dtcms.com/a/610399.html

相关文章:

  • 域名注册要多少钱信阳新网站做seo优化
  • 做网站盈利方式开发一个简单的app需要多少钱
  • RPA 重构财务新生态:自动化驱动的转型革命
  • Kubernetes调度器深度解析:从资源分配到亲和性策略的架构师之路
  • 具身智能-一文详解视觉-语言-动作(VLA)大模型(3
  • 【Linux C/C++开发】libusb库操作-获取USB设备信息
  • LeetCode 刷题【154. 寻找旋转排序数组中的最小值 II】
  • 大视频秒级同步:高性能跨系统视频数据迁移实战方案
  • 手机网站制作哪家公司好wordpress 查件
  • 优化 TDengine IDMP 面板编辑的几种方法​
  • 定制开发AI智能名片S2B2C预约服务小程序的定制开发与优势分析
  • 哪个做网站平台好电子商务与网站建设实践论文
  • 填充每个节点的下一个右侧节点指针(一)
  • 基于RFSOC47DR的射频采集卡
  • 东莞齐诺做网站网站做服装那个平台好一点
  • 长春模板网站建设企业网站开发难吗
  • 国外网站不需要备案吗看wordpress导出文章
  • DeepSeek-OCR私有化部署—从零构建OCR服务环境
  • Navicat 17 连接 SQL Server 后在导航栏中没有显示数据库表对象,如何解决?
  • 官方网站下载手电筒网站设置在哪
  • 如何建设阿里巴巴网站东莞现代建设有限公司
  • 【openGauss】让gsql和sqlplus输出包含有SQL及数据的完全一致的文本文件
  • LingJing(灵境)桌面级靶场平台新增靶机:加密攻防新挑战:encrypt-labs靶场,全面提升安全研究者的实战能力!
  • 高通SMD450 pop音问题回顾
  • 【LeetCode】将 x 减到 0 的最小操作数
  • Spring Boot 2.7.x 至 2.7.18 及更旧的版本,漏洞说明
  • GEO:抢占AI流量新入口,让品牌成为智能问答中的“标准答案”
  • 钓鱼网站免费空间公司做网站有意义么
  • 单片机超轻量级多任务操作系统实战指南
  • 如何下载各个版本MacOS系统安装包