26

我想将我的应用程序的各个部分移动到简单的脚本中,以允许对 C++ 不甚了解的人能够编辑和实现各种功能。

因为它是一个实时应用程序,所以我需要对这些脚本进行某种多任务处理。理想情况下,我希望它让 c++ 应用程序调用一个脚本函数,然后继续运行(在 c++ 线程下),直到一个暂停点(Wait(x)),或者它返回。在等待的情况下,需要保存状态,以便在持续时间到期后下一次应用程序循环时重新启动脚本。

脚本还需要能够调用 c++ 类方法,最好使用 c++ 类,而不是围绕 c++ 类的普通包装函数。

我不想花费大量时间来实现这一点,因此使用现有的脚本语言比编写自己的脚本语言更可取。我听说 Python 和 Lua 可以集成到一个 c++ 应用程序中,但我不知道如何做到这一点以实现我的目标。

  • 脚本必须能够调用 c++ 函数
  • 当调用某些函数(例如等待)时,脚本必须能够“暂停”,并由 c++ 线程再次重新启动
  • 需要快速——这是一个实时应用程序,可能有很多脚本正在运行。

如果可以保存和重新启动脚本(可能由与原始线程不同的线程),我可能可以相当轻松地滚动多任务代码。

4

9 回答 9

26

您可以使用 Lua 或 Python。Lua 比 python 更“轻量级”。它的内存占用比 python 小,并且根据我们的经验更容易集成(人们在这一点上的里程可能会有所不同)。它可以支持一堆脚本同时运行。至少,Lua 支持以您想要的方式停止/启动线程。

Boost.python 很好,但在我(有限的)经验中,我们很难为不同的环境进行编译,而且相当重量级。它有(在我看来)需要 Boost 的缺点。对于某些人来说,这可能不是问题,但如果您不需要 Boost(或不使用它),您将引入大量代码来让 Boost.python 工作。YMMV。

我们已将 Lua 构建到多个平台(win32、Xbox360 和 PS3)上的应用程序中。我相信它可以在 x64 上运行。使用 Luabind 的建议很好。我们最终在两者之间编写了自己的接口,虽然不太复杂,但拥有该胶水代码将为您节省大量时间,也许还会让您烦恼。

但是,无论使用哪种解决方案,调试都可能很痛苦。我们目前没有很好的解决方案来调试嵌入到我们应用程序中的 Lua 脚本。由于我们没有在我们的应用程序中使用 python,我无法谈论那里可能有哪些工具可用,但几年前情况大致相同——调试很差。使用脚本来扩展功能很好,但脚本中的错误可能会导致问题并且可能难以定位。

如果您需要在那里进行更改,Lua 代码本身就有点混乱。我们已经在 Lua 代码库本身中看到了难以追踪的错误。我怀疑 Boost::Python 可能有类似的问题。

并且对于任何脚本语言,它不一定是“非程序员”扩展功能的解决方案。看起来好像是这样,但您最终可能会花费大量时间来调试脚本,甚至可能是 Lua。

总而言之,我们对 Lua 非常满意,并在两场比赛中发布了它。我们目前没有放弃该语言的计划。总而言之,我们发现它比几年前可用的其他替代品更好。Python(和 IronPython)是其他选择,但根据经验,它们似乎比 Lua 更笨重。不过,我很想听听那里的其他经历。

于 2008-09-15T16:56:52.113 回答
9

我强烈建议您看一下Luabind。它将 Lua 集成到您的 C++ 代码中变得非常简单,反之亦然。也可以公开整个 C++ 类以在 Lua 中使用。

于 2008-09-15T15:19:01.600 回答
5

最好的办法是嵌入 lua (www.lua.org) 或 python (www.python.org)。两者都用于游戏行业,并且都相对容易地访问 extern "C" 函数,而 lua 在这里具有优势(因为数据类型更容易在 lua 和 C 之间转换)。与 C++ 对象的接口对您来说需要更多的工作,但您可以在 Google、lua 或 python 讨论论坛上查找如何执行此操作。

我希望这会有所帮助!

于 2008-09-15T15:27:16.040 回答
3

你绝对可以用 Python 做你想做的事。 这是将 Python 嵌入应用程序的文档。 我很确定 Lua 也可以,只是我对它不太熟悉。

您正在描述协作式多任务处理,其中脚本需要定期调用 Break 或 Wait 函数。也许更好的解决方案是在自己的线程中运行脚本语言,然后使用互斥锁或无锁队列作为脚本语言和程序其余部分之间的接口。这样,一个不经常调用 Break() 的错误脚本就不会意外冻结您的程序。

于 2008-09-15T15:22:44.413 回答
2

看看Boost.Python库。看起来做你想做的事情应该相当简单。

于 2008-09-15T15:18:15.767 回答
2

看看SWIG。我用它来与 Python 交互,但它支持许多其他语言。

于 2008-09-15T17:04:42.577 回答
2

再投一票给 Lua。它很小,速度很快,不会消耗太多内存(对于游戏,最好的选择是在初始化时分配大缓冲区并在那里重新定向所有 Lua 内存分配)。我们使用 tolua 生成绑定,但还有其他选项,其中大多数比 boost.python 更小/更易于使用 (IMO)。

于 2008-09-15T17:22:06.327 回答
2

至于调试 Lua(如果你走那条路),我一直在使用 DeCoda,而且还不错。它假装是一个 IDE,但在那方面失败了,但您可以将调试过程附加到 Visual Studio,并在断点处向下调用堆栈。非常方便追踪该错误。

于 2008-12-20T17:54:31.383 回答
1

您还可以使用Ch嵌入 C/C++ 脚本。我一直在将它用于我正在从事的游戏项目,并且效果很好。力量和适应性的完美结合。

于 2008-09-15T16:08:43.650 回答