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. tkinter的函数与实例
  2. 判断输入的字符是不是数字
  3. openwrt下让telnetl与ssh(dropbear)共存
  4. 如何用python创建一个下载网站-使用Python下载文件的简单示例
  5. python爬虫原理-python爬虫之认识爬虫和爬虫原理
  6. 数学知识笔记:拉格朗日乘子
  7. 使用web worker和webassembly技术
  8. Spring boot其他框架日志
  9. 子组件调用父组件方法_Vuejs组件(一)组件的注册使用方法
  10. 从数据结构到算法:图网络方法初探
  11. linux如何过滤字符串,在linux系统如何grep过滤中,不包含某些字符串的命令
  12. hdu 6899 Xor 数位dp
  13. HTML左边和右边是固定的宽度但是中间是自动的布局方式
  14. 操作系统 ——进程的状态与转换
  15. android执行lua脚本的方法,从Android应用程序调用Lua脚本
  16. Docker 安装 MongoDB教程
  17. 如何编程在一个文本文件中每隔n个字符插入一个换行符c语言实现,C语言程序设计A形成性作业及答案(31页)-原创力文档...
  18. 图注意力网络(GAT) TensorFlow解析
  19. Atitit.部分错误 设计模式,异常处理框架atiPartErr 的总结
  20. CTF常见的php函数

热门文章

  1. 【云计算】1_云计算基础介绍
  2. STM32CubeMX实现串口DMA中断通信
  3. 免费ssl申请且如何应用到宝塔
  4. 上面一个星星下面一个r_谁能告诉我微博那个红色五角星有个R?
  5. 36 选 7 彩票机选程序
  6. NeuroAI作者,冷泉港主任独家专访:忽视神经科学给我们的启示是愚蠢的
  7. grab显示服务器报错,grab链接不到服务器怎么解决
  8. 简单有创意的思维导图怎么画
  9. 阿里M8级铁子整理出SQL手册:收获不止SQL优化,抓住SQL的本质
  10. 要么忍,要么狠,要么滚