Unity动态加载与内存关系3:AssetBundle (Addressable Assets)篇
接着前两篇,我们继续测试 AssetBundle 方式的资源加载(实际是 用最新的Addressable Assets方式),然后再销毁与卸载,观察对应的内存变化。
这里不讲解 AssetBundle 的基本原理了,不了解的同学可以看官方文档:
https://docs.unity3d.com/Manual/AssetBundlesIntro.html
Addressable Assets 说明文档:
https://docs.unity3d.com/Packages/com.unity.addressables@1.8/manual/AddressableAssetsGettingStarted.html
先说结论:
1,不触发时,不占用什么资源
2,Addressables.LoadAssetAsync()会载入Mesh(几乎等同于 Resources.Load() )。
3,Instantiate()生成游戏体的时候,会载入对应的Texture,占用内存。
4,Addressables.ReleaseInstance() 销毁游戏体时,会马上释放小部分显存。Unity等待GC时机*(见下面注释1),再进行内存清理。
5,Resources.UnloadUnusedAssets() 可以清理内存,会把没有使用(或者资源=null)的资源清理掉。注意,官方建议在允许卡顿的情况下调用(比如loading界面),因为这是一个非常缓慢的操作。
注释1: 对于bundle(里面含有资源A/B/C),你可以部分加载(比如A),或者全部加载(ABC),但不能部分卸载。在bundle本身完全卸载之前,不会卸载任何东西.。除非你调用了Resources.UnloadUnusedAssets()。官方文档的解释:https://docs.unity3d.com/Packages/com.unity.addressables@1.8/manual/MemoryManagement.html
下面是试验过程,可以不看:
在空场景的摄像机上,挂上如下脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;/// <summary>
/// 设计编写:常成功
/// 创建时间:2020/05/09
/// 脚本功能:Addressables 测试, Instantiate()实例化后, 再卸载资源
/// 挂载位置:默认场景的摄像机上
/// </summary>public class Test_A_Mem_2 : MonoBehaviour
{// 记录实例化的游戏体public List<GameObject> obj_list;// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){// 按下[1], 加载资源并实例化if (Input.GetKeyDown(KeyCode.Alpha1)){Debug.Log("Num 1: InstantiateAsync");Addressables.InstantiateAsync("Assets/Scenes/Test_Memery/prefabs/atc_geye@idle.prefab").Completed += OnLoadDone;}// 按下[2], 加载资源并实例化if (Input.GetKeyDown(KeyCode.Alpha2)){Debug.Log("Num 2: InstantiateAsync");Addressables.InstantiateAsync("Assets/Scenes/Test_Memery/prefabs/atc_niya@idle.prefab").Completed += OnLoadDone;}// 按下[3], 加载资源并实例化if (Input.GetKeyDown(KeyCode.Alpha3)){Debug.Log("Num 3: InstantiateAsync");Addressables.InstantiateAsync("Assets/Scenes/Test_Memery/prefabs/Car_2C 1.prefab").Completed += OnLoadDone;}// 按下[右键], 以游戏体为单位, 逐个释放资源 if (Input.GetMouseButtonDown(1)){int tail_index = obj_list.Count - 1;// 相当于Destroy()Addressables.ReleaseInstance(obj_list[tail_index]);obj_list.RemoveAt(tail_index);Debug.Log("Mouse R:" + tail_index.ToString());}// 按下[D], 释放已经没有引用的资源if (Input.GetKeyDown(KeyCode.D)){obj_list = null;Debug.Log("Key D:");Resources.UnloadUnusedAssets();}}// 异步加载的回调函数private void OnLoadDone(UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle<GameObject> obj){// In a production environment, you should add exception handling to catch scenarios such as a null result.if (obj.Result != null){obj_list.Add(obj.Result);}else{Debug.LogWarning("LoadAssetAsync Error! ");}}
}
1
2
3
右1
右2
右3
D
Unity动态加载与内存关系3:AssetBundle (Addressable Assets)篇相关推荐
- Unity动态加载与内存关系2:Resources.Load 篇
接着上一篇,我们继续测试Resources.Load 资源加载,然后再销毁与卸载,观察对应的内存变化. 先说结论: 1,不触发时,不占用什么资源(请对比上一篇prefab模式,那个要占, 其实就相当于 ...
- Unity动态加载和内存管理(三合一)
原址:http://game.ceeger.com/forum/read.php?tid=4394#info 最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Re ...
- Unity动态加载3D模型
Unity动态加载3D模型 在Unity中创建游戏对象的方法有 3 种: 第一种是将物体模型资源由 Project 视图直接拖曳到 Hierarchy 面板中: 第二种是在 Unity 3D 菜单 G ...
- Unity动态加载外部服务器上的FBX模型
去年某项目需要从后端服务器上加载FBX模型,但是整个项目中只有很少的地方需要用到动态模型替换,并且项目交付后需要外行人员也能轻松上手更换需要动态加载的模型,所以需要实现一个简单的模型打包和动态模型加载 ...
- unity动态加载.obj文件相关
.obj文件加载相关 QA: 要点 .obj文件结构 .mtl文件结构 材质匹配问题 动态加载obj文件 unity资源商城插件:Runtime Obj Importer QA: q: 如何动态加载o ...
- Unity 动态加载Prefab
Unity动态记载Prefab 第一种方法,从Resources文件夹读取Prefab Assets/Resources是Unity中的一个特殊文件夹,放在这个文件夹里的资源包括Prefab可以被代码 ...
- Unity动态加载场景
不用在build setting中设置,使用ab包动态加载场景 1.把场景打成ab包 2.加载ab资源,然后加载场景 demo链接 链接:https://pan.baidu.com/s/1dP9ihT ...
- unity动态加载obj文件
unity2018.4.2f1 vs2017 最近项目需求,需要实现动态读物外部obj模型,并加载到场景中,研究了好几天,终于实现了,在此做个记录. 1.首先随便找个.obj模型,带贴图,我的资源截图 ...
- 【胖虎的逆向之路】01——动态加载和类加载机制详解
胖虎的逆向之路 01--动态加载和类加载机制详解 一.前言 二.类的加载器 1. 双亲委派模式 2. Android 中的类加载机制 1)Android 基本类的预加载 2)Android类加载器层级 ...
最新文章
- 2010上半年网络规划设计师下午试卷Ⅱ与论文写作要点
- 【网络安全】2022年第一次靶场渗透实战学习
- ⅰcp经济模型_干货!来自清华小哥哥的全家桶教程——手把手教你在本地构建 Nervos AppChain...
- windows之如何刷新电脑DNS缓存
- Leetcode--8
- spring集成quartz框架
- java注解获取参数_JAVA 自定义注解及参数获取 | 学步园
- leetcode 172. Factorial Trailing Zeroes(阶乘的末尾有多少个0)
- 【图神经网络】ChebyNet-切比雪夫多项式近似图卷积核
- 虚拟机IP地址和主机IP不在同一个网段
- CSS的Border属性 属性 边框 可以 定义 宽度 颜色 CSS solid 类型 文本
- 浏览器在线视频播放加速方法——直接修改网页代码实现加速
- The ALTER TABLE statement conflicted with the FOREIGN KEY constraint FK_SortId.
- 五子棋PVP项目总结
- 除了同性交友平台 GitHub,程序员们业余时间还可以去哪儿?
- 对一个整形数组进行顺序排列
- LeetCode_575_分糖果
- HID Global赢得爱尔兰护照合同
- kettle工具之阻塞数据直到步骤都完成
- 基于jquery+php+mysql 制作 仿google日历记事