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;
    }
}

unity游戏引擎-在现有的c#代码中找到.我应该把它扔掉吗?

它有自动垃圾收集,所以我的理解是的外部,当它方便时,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()一无所知,因此不会调用它。