释放非托管资源

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值