在c ++ app中实现脚本

时间:2008-09-15 15:11:43

标签: c++ scripting

我希望将我的应用的各个部分移动到简单的脚本中,以便那些不具备c ++知识的人能够编辑和实现各种功能。

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

脚本还需要能够调用c ++类方法,理想情况下使用c ++类而不是c ++类的普通包装函数。

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

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

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

9 个答案:

答案 0 :(得分:25)

您可以使用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更加沉重。我很想听听那里的其他经历。

答案 1 :(得分:9)

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

答案 2 :(得分:5)

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

我希望有所帮助!

答案 3 :(得分:3)

你绝对可以用Python做你想做的事。 Here are the docs on embedding Python into an application.我很确定Lua也会工作,我对它不太熟悉。

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

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

答案 6 :(得分:2)

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

答案 7 :(得分:2)

至于调试Lua(如果你去那条路线),我一直在使用DeCoda,它并没有坏。它假装是一个IDE,但sorta失败了,但您可以将调试过程附加到visual studio,并在断点处调用调用堆栈。追踪那个错误非常方便。

答案 8 :(得分:1)

您还可以使用Ch嵌入C / C ++脚本。我一直在将它用于我正在进行的游戏项目,并且它做得很好。良好的力量和适应性。