Notifications
Article
使用Addressable更好的管理内存
Published 3 months ago
665
4
使用Addressable更好的管理内存
你好,我是郑洪智,你可以叫我大智。我正在带小新学Unity。
小新:“智哥,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中文手册》,更有视频教程哦~
Tags:
大智
你的Unity技术探路者/洪流学堂公众号主理人/XR创业者 - Student
33
Comments
大智
3 months ago
你的Unity技术探路者/洪流学堂公众号主理人/XR创业者
安泽豪这个已经可以正式使用了吗
可以了,正式版的~
0
2
2823896
3 months ago
技术说一半,到关键点放广告,浪费大家时间
0
安泽豪
3 months ago
这个已经可以正式使用了吗
1
l
long
3 months ago
没干货分享只是来诱导流量了……
2