为游戏和其他实时应用程序调整 .NET 4.5 GC 的常用方法?

Common ways to tweak the .NET 4.5 GC for games and other real time applications?

我正在使用 C# 开发游戏引擎,运行 遇到这样的情况:在执行一些内存密集型操作时,垃圾收集会导致每多帧出现一次明显的卡顿。在 .NET 中调整垃圾收集器以避免此类问题或以其他方式针对实时应用程序对其进行优化的常用方法有哪些?

从分析开始。找出是什么给你带来麻烦,并找到摆脱它的方法。有一些调整,例如使用多线程 GC,但这只对具有几个工作线程的服务器应用程序有很大帮助。

你最好的办法是确保你释放的大部分内存仍在第 0 代 - 这些收集通常足够快,不会在 60 FPS 应用程序中引入卡顿。

当然,就像在 C++ 或其他语言中一样 - 限制您的分配和释放。您可能正在做很多完全没有必要的事情——同样,分析可以帮助您非常轻松地查明这些事情。如果您每隔几帧就收集一次,那您就大错特错了。

当然,C++ 为您提供了更多选项,例如重用内存。然而,这并不是无法克服的。 GC 仅处理堆分配(和收集)——堆栈仅用作根引用之一。因此,根据您的设计,如果您在你的方法中分配新的 类 作为局部变量,用 structs 替换它们可能是非常值得的,这将倾向于在堆栈上分配。没有办法 force 这种行为(在不安全的代码之外 - 在尝试之前你应该总是思考 10 次 :D),但是 CLR 确实尝试将任何可以放在堆栈上的堆栈:)