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

中国建设银行网站用户名襄阳网站建设培训

中国建设银行网站用户名,襄阳网站建设培训,如何制作营销网站模板,休闲食品网站建设策划书1、什么是引用计数规则? 当通过加载使用可寻址资源时,Addressables会在内部帮助我们进行引用计数,使用资源时,引用计数1,释放资源时,引用计数-1,当可寻址资源的引用为0时,就可以卸载…

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){// 由于存在同名,不同类型资源区分加载,所以通过名字和类型进行拼接作为 Keystring keyName = name + "_" + typeof(T).Name;AsyncOperationHandle<T> handle;// 已经加载过该资源if (resDic.ContainsKey(keyName)){// 获取异步加载返回的 handlehandle = resDic[keyName].handle.Convert<T>();resDic[keyName].count += 1;if (handle.IsDone){callback(handle);}// 还没有加载完成else {// 如果还没有异步加载完成,只需要添加委托告诉完成后做什么handle.Completed += (obj) =>{if (obj.Status == AsyncOperationStatus.Succeeded)callback(obj);};}return;}// 如果没有加载过该资源,直接进行异步加载并记录handle = Addressables.LoadAssetAsync<T>(name);handle.Completed += (obj) =>{if (obj.Status == AsyncOperationStatus.Succeeded)callback(obj);else{Debug.LogWarning(keyName + " load asset failed");if (resDic.ContainsKey(keyName))resDic.Remove(keyName);}};AddresssablesInfo info = new AddresssablesInfo(handle);resDic.Add(keyName, info);}public void Release<T>(string name){string keyName = name + "_" + typeof(T).Name;if (resDic.ContainsKey(keyName)){resDic[keyName].count -= 1;if (resDic[keyName].count == 0){AsyncOperationHandle<T> handle = resDic[keyName].handle.Convert<T>();Addressables.Release(handle);resDic.Remove(keyName);}}}// 异步加载多个资源 或者 加载指定资源private string FormatKeyName<T>(List<string> keys){string keyName = "";foreach (string key in keys)keyName += key + "_";keyName += typeof(T).Name;return keyName;}public void LoadAssetAsync<T>(Addressables.MergeMode mode, Action<T> callBack, params string[] keys){// 1.构建一个 keyName 之后存入到字典中List<string> list = new List<string>(keys);string keyName = FormatKeyName<T>(list);// 2.判断是否存在已经加载过的内容AsyncOperationHandle<IList<T>> handle;if (resDic.ContainsKey(keyName)){handle = resDic[keyName].handle.Convert<IList<T>>();resDic[keyName].count += 1;// 异步加载是否结束if (handle.IsDone){foreach(T item in handle.Result) callBack(item);}else{handle.Completed += (obj) =>{if (obj.Status == AsyncOperationStatus.Succeeded){foreach (T item in handle.Result)callBack(item);}};}return;}handle = Addressables.LoadAssetsAsync<T>(list, callBack, mode);handle.Completed += (obj) =>{if (obj.Status == AsyncOperationStatus.Failed){Debug.LogWarning(keyName + " load asset failed");if (resDic.ContainsKey(keyName))resDic.Remove(keyName);}};AddresssablesInfo info = new AddresssablesInfo(handle);resDic.Add(keyName, info);}public void LoadAssetAsync<T>(Addressables.MergeMode mode, Action<AsyncOperationHandle<IList<T>>> callBack, params string[] keys){// 1.构建一个 keyName 之后存入到字典中List<string> list = new List<string>(keys);string keyName = FormatKeyName<T>(list);// 2.判断是否存在已经加载过的内容AsyncOperationHandle<IList<T>> handle;if (resDic.ContainsKey(keyName)){handle = resDic[keyName].handle.Convert<IList<T>>();resDic[keyName].count += 1;// 异步加载是否结束if (handle.IsDone){callBack(handle);}else{handle.Completed += (obj) =>{if (obj.Status == AsyncOperationStatus.Succeeded){callBack(handle);}};}return;}handle = Addressables.LoadAssetsAsync<T>(list, null, mode);handle.Completed += (obj) =>{if (obj.Status == AsyncOperationStatus.Failed){Debug.LogWarning(keyName + " load asset failed");if (resDic.ContainsKey(keyName))resDic.Remove(keyName);}else{callBack(handle);}};AddresssablesInfo info = new AddresssablesInfo(handle);resDic.Add(keyName, info);}public void Release<T>(params string[] keys){List<string> list = new List<string>(keys);string keyName = FormatKeyName<T>(list);if ( resDic.ContainsKey(keyName)){resDic[keyName].count -= 1;if (resDic[keyName].count == 0){AsyncOperationHandle<IList<T>> handle = resDic[keyName].handle.Convert<IList<T>>();Addressables.Release(handle);resDic.Remove(keyName);}}}public void Clear(){foreach (var item in resDic.Values){Addressables.Release(item.handle);}resDic.Clear();AssetBundle.UnloadAllAssetBundles(true);Resources.UnloadUnusedAssets();GC.Collect();}}

http://www.yayakq.cn/news/877775/

相关文章:

  • 网站管理系统排行榜做网站需要的知识
  • dede网站怎么做微信小程序快飞建站
  • 直播网站建设重庆中化建工北京建设投资有限公司网站
  • 美食网站中饮食资讯该怎么做免费知识库管理系统
  • 桂林北站到两江机场大巴时刻表正规做网站公司
  • 网站支付怎么做安全吗建设工程安全管理网站
  • 重庆网站开发培训机构电商网站建设功能
  • 淮北市重点工程建设局网站phpcms 中英文网站
  • 万网域名注册查询商丘做网站seo
  • 个人网站建设详细教程做招牌的网站有哪些
  • 都有什么类别的网站最新科技新闻消息
  • 电商网站建设如何腾讯企业邮箱官网登录入口
  • 解决方案网站营销型的网站域名
  • wordpress 快站深圳企业建站招聘
  • 西安网站开发外包制作购物网站
  • 为什么不用原来的网站做推广学网站ui设计
  • ps联盟网站北京科兴中维新冠疫苗最新消息
  • 网站建设服务商网站几种颜色
  • 网站界面风格商旅通官网app
  • 在线做印章的网站wordpress获取指定分类
  • 成都专业网站设计好公司onedrive做网站下载盘
  • 公众号第三方网站开发满亦工作室 网站建设
  • 沈阳做网站费用phpcms律师网站模板
  • 外国网站的浏览器有哪个网站专业做漫画素材的
  • 如何做网站的推广wordpress cookie伪造
  • 自己做的网站怎么才能在百度上查找延庆区加工网站建设推广
  • 创立公司网站有限责任公司优缺点
  • 毕业网站设计天眼查官网查个人
  • 公司建的是网页还是网站wordpress一登录就错位
  • 延安网站建设推广微信网站60平方旧房翻新装修要多少钱