Unity图片、AssetBundle、GameObject等资源通过path或url加载,避免在内存中重复加载。

该脚本只是管理,由于是采用object类型,所以可用于管理Unity中上述资源。

首次加载过程需要自己实现,可参考FIleGet、HttpGet进行扩展,这两个方法是图片网络、本地加载,回调为加载成功后的资源,需要在回调中进行强制类型转换。

如果不是通过该类进行加载,需要显式调用Reference。例如,调用GameObject.Instantiate后需要调用。

using System;
using System.Collections.Generic;
using UnityEngine;
using Object = UnityEngine.Object;/*create by keefor on 2021/3/26*/
public class MemoryCache : ISingleton<MemoryCache>
{public class FuncColl{public WeakReference tar;public Action<object> over;}[Serializable]public class table{public bool load;public string url; public WeakReference res;public List<WeakReference> tars;public List<Action<object>> over;public List<FuncColl> funcList;}private List<table> cachelist = new List<table>();private table FindTable(string url){for (int i = 0; i < cachelist.Count; i++){if (url == cachelist[i].url) return cachelist[i];}return null;}private void push(List<WeakReference> list,Object obj){for (int i = 0;i<list.Count ;i++){if (list[i] == null||list[i].Target==null||list[i].Target.ToString()=="null"){list[i] =new WeakReference(obj);return;}}list.Add(new WeakReference(obj));}private void resetFunc(object tar){for (int i = 0; i < cachelist.Count; i++){var tars = cachelist[i].funcList;for (int j = 0; j < tars.Count; j++){if (tars[j].tar!=null&&tars[j].tar.Target == tar){tars[j].over = null;tars[j].tar = null;}}}}public void Set(string url,object tar,Action<object> callback,Action<Action<object>> request){if (tar == null) return;//todo:tar替换素材需要移除,var tab = FindTable(url);if (tab != null){if (tab.load){if (tab.res?.Target!=null&&tab.res.Target.ToString()!="null"){                // push(tab.tars,tar);callback?.Invoke(tab.res.Target);return;}cachelist.Remove(tab);}else{//回调已解决,给叽几比个耶。resetFunc(tar);tab.funcList.Add(new FuncColl(){over = callback,tar = new WeakReference(tar)});// push(tab.tars,tar);return;}}resetFunc(tar);var item = new table() {url = url,load = false,tars = new List<WeakReference>() {},funcList = new List<FuncColl>()};item.funcList.Add(new FuncColl(){over = callback,tar = new WeakReference(tar)});cachelist.Add(item);request(oo =>{item.res = new WeakReference(oo);oo = null;item.load = true;for (int i = 0; i < item.funcList.Count; i++){item.funcList[i].over?.Invoke( item.res?.Target);}item.funcList.Clear();});}public void Reference(string url,Object tar){var tab = FindTable(url);if (tab != null){if (tab.load){push(tab.tars,tar);}}}public void Get(string url,Action<object> callback,Action<Action<object>> request){var tab = FindTable(url);if (tab != null){if (tab.load){if (tab.res?.Target!=null&&tab.res.Target.ToString()!="null"){                callback?.Invoke(tab.res.Target);return;}cachelist.Remove(tab);}else{tab.over.Add(callback);return;}}var item = new table() {url = url,load = false,tars = new List<WeakReference>() {},over = new List<Action<object>>(){callback}};cachelist.Add(item);request(oo =>{ item.res = new WeakReference(oo);oo = null;item.load = true;for (int i = 0; i < item.over.Count; i++){item.over[i]?.Invoke( item.res?.Target);}item.over.Clear();});}
/// <summary>
/// 不会用,不要调这个方法
/// </summary>public void release(){bool des;for (int i = cachelist.Count-1; i >=0 ; i--){des = true;var ll = cachelist[i].tars;for (int j = 0; j < ll.Count; j++){if (ll[j] != null&&ll[j].ToString()!="null"){des = false; break;}}if (des){if (cachelist[i].res?.Target!=null&&cachelist[i].res.Target.ToString()!="null"){Destroy(cachelist[i].res.Target as Object);}cachelist.RemoveAt(i);}}}public List<table> RemoveNoRef(){bool des;var list = new List<table>();for (int i = cachelist.Count-1; i >=0 ; i--){des = true;if(!cachelist[i].load)continue;var ll = cachelist[i].tars;for (int j = 0; j < ll.Count; j++){if (ll[j] != null&&ll[j].Target != null&&ll[j].Target.ToString()!="null"){des = false; break;}}if(des){list.Add(cachelist[i]);cachelist.RemoveAt(i);}}return list;}public void FileGet(string url,Object tar,Action<object> callback){//和设置点击事件一样,完美Set(url,tar, callback,call=>{HttpFileHelper.Instance.Texture(url, call);});}public void HttpGet(string url,Object tar,Action<object> callback){Set(url,tar, callback,call=>{HttpFileHelper.Instance.Texture(url, call,null,true);});}
/// <summary>
/// todo:待测试
/// </summary>public static void Release(){Resources.UnloadUnusedAssets();System.GC.Collect();// Instance.release();}
}

Unity资源缓存(内存)相关推荐

  1. Unity资源处理机制(Assets/WWW/AssetBundle/...)读取和加载资源方式详解

    Unity资源机制 1.概述 本文意在阐述Unity资源机制相关的信息,以及一些关于个人的理解与试验结果.另外还会提及一些因机制问题可能会出现的异常以及处理建议.大部分机制信息来源于官方文档,另外为自 ...

  2. Unity资源加载入门

    写在前面 本文转载自:https://gameinstitute.qq.com/community/detail/123460,供自己学习用,如有疑问,请移步原创. 引言 Unity的资源加载及管理, ...

  3. Unity资源加载管理

    转载链接: https://bbs.gameres.com/thread_800362_1_1.html 我理解的资源管理 举一个不恰当的例子来描述我所理解的资源管理(因为我实在想不出更合适的例子了) ...

  4. 网络:浏览器静态资源缓存机制

    一.前言 为什么需要缓存? 缓存可以说是性能优化中简单高效的一种优化方式了.一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并且由于缓存文件可以重复利用,还可以减少带宽,降低网络负荷. 对于一 ...

  5. android h5游戏图片不缓存,H5小游戏资源缓存方法与流程

    本发明涉及H5资源缓存领域,尤其涉及H5小游戏资源缓存方法. 背景技术: 随着移动互联网的发展和手机硬件性能的不断提升,H5小游戏这种不需要下载安装即可使用的全新游戏应用得到了爆发式发展.这种用完即走 ...

  6. nginx静态资源缓存与压缩

    一.静态资源缓存 参考文章 (1)apache设置max-age或expires 这里需要修改.htaccess文件. <IfModule mod_headers.c><FilesM ...

  7. nginx静态资源缓存和gzip压缩

    其实这章主要就是优化访问时间和减少宽带问题 优化访问时间,一般css,js,woff还有图片都是静态文件,是一般都不用更改得,如果每次请求都要走tomcat,都是要耗时一些的,那么可以第一次访问的时候 ...

  8. unity 性能优化--内存篇(上)

    资源内存占用 在一个较为复杂的大中型项目中,资源的内存占用往往占据了总体内存的70%以上.因此,资源使用是否恰当直接决定了项目的内存占用情况.一般来说,一款游戏项目的资源主要可分为如下几种:纹理(Te ...

  9. [翻译]理解Unity的自动内存管理

    当创建对象.字符串或数组时,存储它所需的内存将从称为堆的中央池中分配.当项目不再使用时,它曾经占用的内存可以被回收并用于别的东西.在过去,通常由程序员通过适当的函数调用明确地分配和释放这些堆内存块.如 ...

最新文章

  1. Linux C使用bool类型 出现错误expected '=', ',', ';', 'asm' or '__attribute__'
  2. AngularJS 拦截器和好棒例子
  3. docker安装nexus3命令
  4. 纽约时代广场广告费才7千元每天,花钱装逼值不值?
  5. qt ui指针和本类对象_您需要了解的有关UI设计的形状和对象的所有信息
  6. 求解最长回文子串----Manacher 算法
  7. 数组的应用 冒泡排序
  8. python字符串常用函数-大小写,删除空格,字符串切片
  9. c语言通讯录管理系统_通讯录管理系统(C语言)
  10. ionic2+angular2中踩的那些坑
  11. 多少开发人员 饿了么_饿了么CPS新社交电商,2020年的创业新风口
  12. 简述写基础java小游戏一般思路。
  13. android eclipse clean 变异,Run a clean Android build from Eclipse?
  14. kali下一键破解wifi密码
  15. 有限差分法与有限单元法的区别
  16. 测试语音识别+麦克风效果
  17. (附源码)spring boot火车订票系统 毕业设计 031012
  18. ESXi 6.7 CVE-2018-3646警告的处理
  19. 【OpenVP* 】Centos 部署OpenVP* 证书+多客户端+密码认证
  20. 中科大入学考试(数学)

热门文章

  1. Windows Server 做CA给Centos 颁发证书
  2. linux加密压缩文件gpg,linux文件--GPG 加密解密
  3. 写给海淘新手的 转运选择 攻略(2014最新版,10月13日更新)--转自什么值得买
  4. IBM面试题:海盗分金算法及其思想
  5. 宝马上海车展全球首发新车;宁德时代宣布锂电产业最大规模碳中和规划;玛氏中国冰淇淋本土化生产 | 美通企业周刊...
  6. 免费生信课程|多组学数据整合分析之转录组和蛋白质组分析
  7. 如何修改鼠标右键新建对象的顺序
  8. 网易数据分析高级总监:10年数据分析老司机的深度思考!
  9. [Oracle] 自定义数据类型Type
  10. 如何做一个基于JAVA房产中介预约看房系统毕业设计毕设作品(springboot框架)