释放非托管资源

使用 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

你可能感兴趣的:(Unity)