在.NET中,是否有一种常见的做法可以更轻松地为垃圾回收器释放内存?

15 浏览
0 Comments

在.NET中,是否有一种常见的做法可以更轻松地为垃圾回收器释放内存?

我一直在思考是否有办法在.NET中加快释放内存的速度。我正在用.NET(仅限托管代码)创建一个游戏,不需要太多的图形,但我仍然希望能够正确编写它,以免无谓地降低性能。\n例如,将不再需要的对象赋予null值是否有用?我在互联网上看到了一些示例。

0
0 Comments

在.NET中,大多数与图形相关的对象(Image及其派生类,Graphics,Pen,Brush等)都实现了IDisposable接口。如果你要使用一个对象进行特定的操作,然后不再使用,可以使用以下模式:

using(var g = Graphics.FromBitmap(bmp))
{
    //使用图形对象进行一些操作
}

这样做将确保任何非托管资源在其作用域结束时被释放。

然而,他提到了关于内存的问题,而使用IDisposable与内存没有直接关系。

调用Dispose()方法与内存有关,特别是对于GDI对象(Graphics,Pen,Brush等)。但对于由GC收集的托管内存来说,它的作用很小。

如果他正在进行图像操作,使用IDisposable接口将清理图像句柄和相关内存。

我不使用GDI或任何其他非托管代码。如果我没弄错的话,WPF应该会处理这个问题。

0
0 Comments

在.NET中,内存管理是自动且非常高效的。因此,在编写程序时不需要过于担心内存管理的问题。如果你过早地进行优化,可能会降低内存管理的效率。因此,建议先完成你的游戏,如果运行速度过慢,可以使用性能分析器来找出问题所在。很可能问题不是出在内存上。

解决方法:完成游戏后,如果发现运行速度过慢,可以使用性能分析器来找出问题所在。

0
0 Comments

在.NET中,将不再需要的对象分配为null值是否有用?

通常情况下,不是的。大多数在线示例都是来自于VB6转到.NET的人,而在VB6中这是一种常见的最佳实践。在.NET中,这不是很有帮助的。如果你有一个非常长时间运行的方法,这可能会让垃圾收集器稍早地找到该对象 - 但是如果你的方法如此之长,那你有其他问题。

相反,在.NET中,你应该构建短方法,并在尽可能小的作用域块中尽可能晚地定义变量。使用由作用域确定的变量的"自然"生命周期,但是要保持该自然生命周期尽可能短。

你不应该自己进行垃圾回收,正如这里至少有一个答案所建议的那样。这实际上可能会让事情变得更慢。.NET使用分代垃圾收集器。通过强制进行垃圾回收,你可能会收集到目标对象(也可能不会 - 垃圾收集没有任何保证)。但是你可能还会强制收集一堆尚不能收集的其他对象,并将它们存储在更高级别的代中,从而使它们在将来更难收集。所以就别这么做了。

谢谢你的回答!你说将对象分配为null没有用。但这会有什么影响吗?

:如果你做得太晚,它可能会影响性能。而且无论在哪里使用,它都是一种标准的优化。所以不要这样做。

0