C# Unity游戏对象是托管资源还是非托管资源?
我有一个类,它实例化了场景层次中的几个unity游戏对象。此类实现IDisposable。我应该在这些游戏对象是托管资源还是非托管资源时处理它们 我正在跟踪,那么我应该把像GameObject.Destroy(myGameObject)这样的调用放在哪里呢 多谢各位 编辑: 好的,假设我想在这个类超出范围时销毁它实例化的游戏对象。那你怎么办 编辑2: 我在测试这个系统。我找到了一个解决方案。它不会自动工作,因为不能从不同的线程调用GameObject.Destroy(myGameObject)。它将在内部抛出一个错误CompareBaseObjects。因此,当不再需要时,我调用myClass.Dispose()。此外,我是否将Unity GameObject处理为托管还是非托管似乎也无关紧要C# Unity游戏对象是托管资源还是非托管资源?,c#,unity3d,idisposable,C#,Unity3d,Idisposable,我有一个类,它实例化了场景层次中的几个unity游戏对象。此类实现IDisposable。我应该在这些游戏对象是托管资源还是非托管资源时处理它们 我正在跟踪,那么我应该把像GameObject.Destroy(myGameObject)这样的调用放在哪里呢 多谢各位 编辑: 好的,假设我想在这个类超出范围时销毁它实例化的游戏对象。那你怎么办 编辑2: 我在测试这个系统。我找到了一个解决方案。它不会自动工作,因为不能从不同的线程调用GameObject.Destroy(myGameObject)。
myMain()
{
DisposeTestClass test = new DisposeTestClass();
//...
test.Dispose();
}
class DisposeTestClass : System.IDisposable
{
public GameObject uselessGameobject { get; private set; }
public DisposeTestClass()
{
uselessGameobject = new GameObject("Useless gameobject");
}
#region IDisposable
private bool _disposed;
~DisposeTestClass()
{
Debug.Log("~DisposeTestClass()");
this.Dispose(false);
}
public void Dispose()
{
Debug.Log("Dispose()");
this.Dispose(true);
System.GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
Debug.Log("Dispose(bool)");
if(_disposed)
{
Debug.Log("Disposed. Return.");
return;
}
if(disposing)
{
Debug.Log("Disposing of managed resources...");
// clean up managed resources
/*
if(uselessGameobject != null)
{
GameObject.Destroy(uselessGameobject);
Debug.Log("Game object destroyed.");
}
else
{
Debug.Log("Game object is null.");
}*/
}
Debug.Log("Cleaning up unmanaged resources...");
// clean up unmanaged resources
if(uselessGameobject != null)
{
GameObject.Destroy(uselessGameobject);
Debug.Log("Game object destroyed.");
}
else
{
Debug.Log("Game object is null.");
}
// set the flag
Debug.Log("Setting the disposed flag.");
this._disposed = true;
}
#endregion
}
}不,您不应该实现IDisposable。但是你可以:) “那么我应该把调用GameObject.Destroy(myGameObject)”放在哪里?你想什么时候销毁你的对象?实际上,无论您调用myContainer.Dispose()还是GameObject.Destroy(gObj),这都无关紧要 实现IDisposable的唯一原因是编写“方便”的代码,如:
using(var container = new MyContainer())
using(var somethingElse = new MyObject())
{
\\Logic for container and somethingElse
}
但在统一中,这毫无意义。我很难想象在更新游戏中对象被创建然后被销毁的情况。不,你不应该实现IDisposable。但是你可以:) “那么我应该把调用GameObject.Destroy(myGameObject)”放在哪里?你想什么时候销毁你的对象?实际上,无论您调用myContainer.Dispose()还是GameObject.Destroy(gObj),这都无关紧要 实现IDisposable的唯一原因是编写“方便”的代码,如:
using(var container = new MyContainer())
using(var somethingElse = new MyObject())
{
\\Logic for container and somethingElse
}
但在统一中,这毫无意义。我很难想象在更新游戏中,对象被创建然后被销毁的情况。嗯,我想你们有点误解了
IDisposable
和using
语句的用途。您不应该在任何地方都实现IDisposable
,而仅仅是为了除去一个对象——这是垃圾收集器的角色,它更清楚对象何时被丢弃
IDisposable
和using
语句用作try/finally
语句(当然,它在引擎盖下要复杂得多),并确保对象不再使用后立即移除/解析。它并不总是托管/非托管资源问题
使用使用
语句不能确保您的游戏对象将被处置。这完全取决于是否有其他物体指向它。因为它看起来像一个根对象,我相信它将被GC尽可能长时间地持有。请注意,即使GC调用对象上的Dispose()
,只要它被引用,它将一直保留在特殊队列中,直到它被释放
另一方面,如果你的<代码>游戏对象< /代码>较少<<代码>游戏>代码>,<>代码>对象< /> >,你不应该考虑使用<代码> IDISPOSTABLE < /C> >,只要它没有与某个连接/文件/外部资源连接。一旦您的对象被认为是垃圾,GC就会声明内存。只要考虑一下,
IDisposable
是CLR对待的有点不同的东西,并不总是要走的路
编辑
根据您在edit中提出的问题——基本上,当对象超出范围时,您什么也不做——如果GC认为它是垃圾,它将与发生的最近的GC收集一起被删除。这就是C#被认为是托管语言的原因,也是您不自行释放内存的原因。嗯,我想您稍微误解了
IDisposable
和using
语句的用途。您不应该在任何地方都实现IDisposable
,而仅仅是为了除去一个对象——这是垃圾收集器的角色,它更清楚对象何时被丢弃
IDisposable
和using
语句用作try/finally
语句(当然,它在引擎盖下要复杂得多),并确保对象不再使用后立即移除/解析。它并不总是托管/非托管资源问题
使用使用
语句不能确保您的游戏对象将被处置。这完全取决于是否有其他物体指向它。因为它看起来像一个根对象,我相信它将被GC尽可能长时间地持有。请注意,即使GC调用对象上的Dispose()
,只要它被引用,它将一直保留在特殊队列中,直到它被释放
另一方面,如果你的<代码>游戏对象< /代码>较少<<代码>游戏>代码>,<>代码>对象< /> >,你不应该考虑使用<代码> IDISPOSTABLE < /C> >,只要它没有与某个连接/文件/外部资源连接。一旦您的对象被认为是垃圾,GC就会声明内存。只要考虑一下,
IDisposable
是CLR对待的有点不同的东西,并不总是要走的路
编辑
根据您在edit中提出的问题——基本上,当对象超出范围时,您什么也不做——如果GC认为它是垃圾,它将与发生的最近的GC收集一起被删除。这就是为什么C#被认为是托管语言,也就是为什么你不自己释放内存。我理解你对垃圾收集器的看法,请参阅我的编辑。即使类的实例超出范围,类创建的游戏对象仍然存在于场景中。我可以编写一个名为Cleanup或MyDispose的方法来销毁游戏对象,并在我不打算处理类的实例后手动调用它。但在Dispose中处理销毁会很方便