使用 using 语法糖清理非托管资源
using (var file = File.Open(path, FileMode.Open))
{
...
}
File 类型属于托管类型,它通过垃圾回收器分配堆内存并自动释放,但它访问的外部文件属于非托管资源,垃圾回收器不能跟踪并释放。
上面 using 语句实际上将编译成:
{
var file = File.Open(path, FileMode.Open);
try
{ ... }
finally
{
file.Dispose(); // 显式调用 Dispose 清理资源
}
}
像 File 一样访问非托管资源的托管类型还有很多,在 C# 中此类型都必须实现 IDisposable 接口
在 Unity 中,通过 Resources 或 AssetBundle 加载的外部资源也属于非托管资源,也有相应的方法进行清理。
{
// 这里新建的 Texture 对象是托管对象,分配堆内存,但实际的图片文件是非托管对象
// 所有这里不管图片多大 tex 在堆中分配的内存都是一样的
Texture tex = Resources.Load<Texture>("Texture");
// 引用资源
GetComponent<RawImage>().texture = tex;
// 在某时间删除该对象,此对象将在下一次垃圾回收时被清理
Destroy(GetComponent<RawImage>());
// 不再有对象引用后,才能成功清理非托管资源
Resources.UnloadUnusedAssets();
}
可参考 https://unity.cn/projects/profilershen-wa-tu-jie-nei-cun-guan-li-10