你好,我是郑洪智,你可以叫我大智。我正在带小新学Unity。
洪流学堂公众号回复addr
,可以下载Addressable中文手册,更有视频教程哦~
小新:“智哥,Assetbundle我只是大概学了一下,但是没咋用过。你说不用它就会有内存问题?”
大智:“咱们来一起做个测试吧。对于工程里的资源,一般有三种方式加载实例化:”
- 场景中的脚本直接在Inspector上引用Prefab
- 资源放在Resources目录下,通过
Resource.Load
加载 - 使用Assetbundle动态加载
直接引用测试
测试1
首先咱们新建一个工程,先整个空场景,使用Profiler先看一下现在的内存占用情况。由于在Editor里面干扰因素比较多,咱们发布出来测试这个空场景的内存,发布时选中这个:
在Unity中打开Profiler(Window > Analysis > Profiler, 快捷键Ctrl+7),然后打开打包好的程序,程序就会自动连上:
可以看到现在的总内存占用是:267M,其中贴图占了75.3M。
测试2
然后给场景里面添加一个简单的脚本,使用public GameObject Prefab;
定义一个成员变量。
using UnityEngine;
public class DirectReference : MonoBehaviour
{
public GameObject ObjPrefab;
}
然后将一个Cube的Prefab拖到这个成员变量上面。Cube上面的材质球带了一张5.3M文件大小的贴图。
发布测试:
以上测试如果在编辑器中测试,会有不准确的地方,但也能看出大概的趋势。如果想要准确的数值可以打包发布以后链接Proflier测试。
可以看到现在的总内存占用是:297M,其中贴图占了80.6M。
对比就会发现即使Prefab没有在场景中实例化,依然占用了内存,这些内存是无法释放掉的。这还仅仅是一个Prefab,很多时候会用到Prefab数组,内存问题就会更严重。
Resources目录测试
测试3
把场景中的脚本去掉,这样就没有直接引用了。把Prefab放到Resources文件夹下,打包测试。
这种情况下你会发现和空场景是一致的,没有内存问题。但是仅仅是这样就完了么?
但是Unity官方是不建议使用Resources目录的,引用一段原话就是:
Assetbundle/Addressable
Addressable是基于Assetbundle的一个资产管理系统。使用Addressable可以通过弱引用的方式来加载资源,不加载之前是没有内存消耗的,加载后也可以完全卸载掉,对内存管理十分友好。
总结
使用Addressable已经很简单了,所以大胆尝试去使用这个系统吧,会给你带来很多益处~
洪流学堂公众号回复addr
,可以下载《Addressable中文手册》,更有视频教程哦~