Lua的GC和实时游戏

据我所知,追踪型GC不能在完整GC期间避免线程阻塞。

我以前使用过XNA+C#,但无法消除GC时间。因此我转用了更低级别的语言C,但我意识到我需要脚本语言。我考虑使用Lua,但我担心Lua的GC机制。Lua使用分步追踪GC,也应该会有线程阻塞。

那么我应该如何在实时游戏中处理这个问题呢?

原文链接 https://stackoverflow.com/questions/4064451

点赞
stackoverflow用户312586
stackoverflow用户312586

正确处理的方法是:

  1. 编写一个只包含想要测试的核心部分的小型原型。
  2. 进行大量分析,重现可以在游戏中发生的不同情况(大量可用内存、少量可用内存、不同数量的线程等)。
  3. 如果没有找到明显的瓶颈,可以使用 Lua。否则,您将不得不寻找替代解决方案(也许是 Lisp 或 Javascript)。
2010-11-02 22:36:18
stackoverflow用户28817
stackoverflow用户28817

Lua的强大之处在于它会让开发者事半功倍。想要类?可以通过元表来创建。想要沙箱?可以使用lua_setfenv

至于垃圾回收机制,首先先使用默认设置。如果后来发现性能问题,可以使用lua_gc进行微调。

以下是一些示例:

  • 在垃圾回收会导致慢速时期时禁用它。

  • 禁用垃圾回收,并在游戏逻辑提示FPS有余地时才启动它。您可以预调整步长,或在运行时发现最佳步长。

  • 禁用回收机,并在停止点执行完全收集,例如在加载屏幕或剪辑场景或热座游戏转换时。

您也可以考虑使用其他脚本语言。Squirrel努力要成为第二代Lua。它试图保留Lua的所有优点,同时舍弃任何设计错误。两者之间的一个重要区别是squirrel使用引用计数而不是垃圾回收。引用计数可能比垃圾回收慢一些,但它非常确定(也就是即时性)。

2010-11-08 21:52:41
stackoverflow用户2013747
stackoverflow用户2013747

你可以修补 Lua 的垃圾回收器,以便限制每个收集周期的时间。例如:http://www.altdevblogaday.com/2011/07/23/predictable-garbage-collection-with-lua/

我认为在收集非常大的表时仍然可能存在长的 GC 步骤时间,因此需要采用避免大型表的编程风格。

以下文章讨论了使用 Lua 进行实时机器人控制的两种策略(1.不生成垃圾;2.使用 O(1)分配器并调整运行 GC 收集的时间): https://www.osadl.org/?id=1117

2014-02-26 22:55:17