unity游戏引擎-在现有的c#代码中找到.我应该把它扔掉吗?
本文关键字:我应该 代码 引擎 游戏 unity | 更新日期: 2023-09-27 17:53:08
我在使用Kinect v2的Unity3D项目中发现了以下代码。我是个偏执狂,所以我想在删除之前先检查一下。但这两行肯定没有理由吧?
colorFrame.Dispose();
colorFrame = null;
这是c#。它具有自动垃圾收集,所以我的理解是,colorFrame将在if(GetRGB)语句之外方便时被处理
if (GetRGB)
{
ColorFrame colorFrame = frame.ColorFrameReference.AcquireFrame ();
if (colorFrame != null)
{
colorFrame.CopyConvertedFrameDataToArray (_ColorData, ColorImageFormat.Rgba);
_ColorTexture.LoadRawTextureData (_ColorData);
_ColorTexture.Apply ();
colorFrame.Dispose ();
colorFrame = null;
}
}
它有自动垃圾收集,所以我的理解是的外部,当它方便时,colorFrame将被处理如果(GetRGB)声明
一旦GC启动(在不确定的时间)并且发现colorFrame
对象没有根,该对象将被清理。在对象上调用Dispose
通常会释放由同一对象分配的非托管资源,以及调用GC.SupressFinalize
,这使得任何具有终结器的对象从终结队列中注销,允许GC"更快"地清理它。
我建议保持呼叫Dispose
。我将删除colorFrame = null
调用,这是无用的。
更好的是,将colorFrame
封装在using
语句中:
if (GetRGB)
{
using (ColorFrame colorFrame = frame.ColorFrameReference.AcquireFrame())
{
if (colorFrame != null)
{
colorFrame.CopyConvertedFrameDataToArray(_ColorData, ColorImageFormat.Rgba);
_ColorTexture.LoadRawTextureData(_ColorData);
_ColorTexture.Apply();
}
}
}
它将在未来不确定的时间被垃圾收集。如果类写得正确,它将包含对Dispose
的内部调用。
但是,您应该始终在IDisposable
对象上调用Dispose
(或者更好,使用using
块),这样它们就可以释放它们当前持有的任何非托管资源,而无需等待框架执行垃圾收集。
垃圾收集是CLR的一部分。IDisposable是一个任意接口,用于在类结束其生命周期时清除类所使用的资源。不要拆除处置!!框架对dispose()一无所知,因此不会调用它。