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

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

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

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

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

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

有帮助吗?

解决方案

您可以使用 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 更严厉。不过,我很想听听那里的其他经历。

其他提示

我强烈推荐你看一下 卢宾德. 。它使得将 Lua 集成到 C++ 代码中变得非常简单,反之亦然。也可以公开整个 C++ 类以在 Lua 中使用。

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

我希望这有帮助!

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

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

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

看一眼 斯威格. 。我用它与 Python 交互,但它支持许多其他语言。

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

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

您还可以使用以下方式嵌入 C/C++ 脚本 Ch. 。我一直在我正在开发的一个游戏项目中使用它,而且效果很好。力量和适应性的完美结合。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top