接着上一篇,我们继续测试Resources.Load 资源加载,然后再销毁与卸载,观察对应的内存变化。

先说结论:

1,不触发时,不占用什么资源(请对比上一篇prefab模式,那个要占, 其实就相当于Resources.Load() )

2,Resources.Load() 的时候,会载入Mesh。

3,Instantiate()生成游戏体的时候,会载入对应的Texture,占用内存。

4,Destroy() 会马上释放小部分显存。Unity等待GC时机*(见下面注释1),再释放部分mesh和texture资源。但是仍不彻底。

5,Resources.UnloadUnusedAssets() 可以清理内存,会把没有使用(或者资源=null)的资源清理掉。注意,官方建议在允许卡顿的情况下调用(比如loading界面),因为这是一个非常缓慢的操作。

注释1: 这里有一个关于内存管理的简单理解:Resources会把资源A/B/C打进一个bundle,你可以部分加载(比如A),或者全部加载(ABC),但不能部分卸载。在bundle本身完全卸载之前,不会卸载任何东西.。除非你调用了Resources.UnloadUnusedAssets()。

下面是试验过程,可以不看。

先获得一个空场景运行的数据,作为参照

在摄像机上,挂上如下脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 设计编写:常成功
/// 创建时间:2020/05/08
/// 脚本功能:测试动态加载与卸载, 基于Resource.
/// 挂载位置:默认场景的摄像机上
/// </summary>public class Test_Mem_Resource : MonoBehaviour
{// 记录load的资源public List<GameObject> load_res_list;// 记录实例化的游戏体public List<GameObject> obj_list;// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){if (Input.GetKeyDown(KeyCode.Alpha1)){Debug.Log("Num 1:");GameObject obj_res = Resources.Load<GameObject>("Test/atc_geye@idle");GameObject the_obj = Instantiate(obj_res);the_obj.transform.position = new Vector3(-2,0,0);load_res_list.Add(obj_res);obj_list.Add(the_obj);// 局部变量, 可以手动显式置null, 也可以不管, 因为已经没有引用了//obj_res = null;    //the_obj = null; }if (Input.GetKeyDown(KeyCode.Alpha2)){Debug.Log("Num 2:");GameObject obj_res = Resources.Load<GameObject>("Test/atc_niya@idle");GameObject the_obj = Instantiate(obj_res);load_res_list.Add(obj_res);obj_list.Add(the_obj);}if (Input.GetKeyDown(KeyCode.Alpha3)){Debug.Log("Num 3:");GameObject obj_res = Resources.Load<GameObject>("Test/Car_2C 1");GameObject the_obj = Instantiate(obj_res);the_obj.transform.position = new Vector3(2, 0, 0);load_res_list.Add(obj_res);obj_list.Add(the_obj);}// Destroy() 游戏体if (Input.GetMouseButtonDown(1)){int tail_index = obj_list.Count -1;Destroy(obj_list[tail_index]);obj_list.RemoveAt(tail_index);Debug.Log("Mouse R:" + tail_index.ToString());}// 释放已经没有引用的资源, 包括Resources.Load()的资源if (Input.GetKeyDown(KeyCode.D)){load_res_list = null;obj_list = null;Debug.Log("Key D:");Resources.UnloadUnusedAssets();}}}

重启编辑器,冷运行程序:

Load() 并且初始化游戏体1次

Load() 并且初始化游戏体2次

Load() 并且初始化游戏体3次

Destroy() 游戏体1次

Destroy() 游戏体2次

Destroy() 游戏体3次

资源引用置null,再调用Resources.UnloadUnusedAssets()

PS:稍微把代码改一下,只Resources.Load(),不Instantiate(),我们看看什么样:

1

2

3

Unity动态加载与内存关系2:Resources.Load 篇相关推荐

  1. Unity动态加载与内存关系3:AssetBundle (Addressable Assets)篇

    接着前两篇,我们继续测试 AssetBundle 方式的资源加载(实际是 用最新的Addressable Assets方式),然后再销毁与卸载,观察对应的内存变化. 这里不讲解 AssetBundle ...

  2. Unity动态加载和内存管理(三合一)

    原址:http://game.ceeger.com/forum/read.php?tid=4394#info 最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Re ...

  3. Unity 动态加载Prefab

    Unity动态记载Prefab 第一种方法,从Resources文件夹读取Prefab Assets/Resources是Unity中的一个特殊文件夹,放在这个文件夹里的资源包括Prefab可以被代码 ...

  4. Unity动态加载3D模型

    Unity动态加载3D模型 在Unity中创建游戏对象的方法有 3 种: 第一种是将物体模型资源由 Project 视图直接拖曳到 Hierarchy 面板中: 第二种是在 Unity 3D 菜单 G ...

  5. Unity动态加载外部服务器上的FBX模型

    去年某项目需要从后端服务器上加载FBX模型,但是整个项目中只有很少的地方需要用到动态模型替换,并且项目交付后需要外行人员也能轻松上手更换需要动态加载的模型,所以需要实现一个简单的模型打包和动态模型加载 ...

  6. unity动态加载.obj文件相关

    .obj文件加载相关 QA: 要点 .obj文件结构 .mtl文件结构 材质匹配问题 动态加载obj文件 unity资源商城插件:Runtime Obj Importer QA: q: 如何动态加载o ...

  7. Unity动态加载场景

    不用在build setting中设置,使用ab包动态加载场景 1.把场景打成ab包 2.加载ab资源,然后加载场景 demo链接 链接:https://pan.baidu.com/s/1dP9ihT ...

  8. js怎么动态加载js文件(JavaScript性能优化篇)

    下面介绍一种JS代码优化的一个小技巧,通过动态加载引入js外部文件来提高网页加载速度 [基本优化] 将所有需要的<script>标签都放在</body>之前,确保脚本执行之前完 ...

  9. unity动态加载obj文件

    unity2018.4.2f1 vs2017 最近项目需求,需要实现动态读物外部obj模型,并加载到场景中,研究了好几天,终于实现了,在此做个记录. 1.首先随便找个.obj模型,带贴图,我的资源截图 ...

最新文章

  1. backbone js学习笔记之第三篇Model (续)
  2. flash 编程技巧应用 原创
  3. 电脑频繁断网怎么回事_家里网络间歇性断网什么原因 家里网络间歇性断网怎么解决【介绍】...
  4. 用纯CSS实现3D立方体效果
  5. echo回声不能用了_回声消除的昨天、今天和明天
  6. leetcode15. 三数之和(三指针)
  7. 【Java】随机发牌程序
  8. 分配菜品类别: 展开 收起_运营技巧:让产品数据决定菜品的去与留
  9. 【阅读】《番茄工作法图解》---让工作更高效
  10. 为什么有时候代码会提示要去掉@override
  11. spring 使用 groovy 的 utf-8 问题
  12. Selenium(二)——webdriver 开始
  13. MThings:ModbusTCP通讯调试调测工具助手
  14. 即将截止?四川省2022年工业领域大企业大集团跨越发展激励项目申报条件、材料、要求及流程
  15. 10 种跨域解决方案(附终极方案)
  16. 大数据必学语言Scala(三十一):scala面向对象 特质(trait)
  17. 计算机毕设(附源码)JAVA-SSM基于Internet快递柜管理系统
  18. 2022版使用云服务器搭建公网k8s容器集群
  19. 谷粒商城微服务分布式基础篇二—— Spring Cloud Alibaba、Nacos注册与发现
  20. Android FingerPrint之指纹识别

热门文章

  1. WPS的网盘如何不显示及办公助手的打开和关闭
  2. Proxmox ve(PVE)中安装openwrt
  3. linux functions传入参数,Functions
  4. 2022新春版:手把手教你搭建Electron17+React17+Antd架构工程
  5. 微信支付,前端显示签名验证失败。
  6. 动态规划篇——最长公共子序列(c++)
  7. JS高级 之 网络编程 - XHR Fetch
  8. 层次聚类python实现_聚类算法之层次聚类(Python实现)
  9. linux oracle 更换ip,Linux 修改IP地址和网关
  10. 2023前端面试题及答案整理(Vue)