我想将我的应用程序的各个部分移动到简单的脚本中,以允许不具备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正常工作.因人而异.
我们已将Lua构建到多个平台(win32,Xbox360和PS3)上的应用程序中.我相信它可以在x64上运行.使用Luabind的建议很好.我们最终在两者之间编写了自己的界面,虽然不是太复杂,但使用胶水代码可以节省大量时间并且可能会加重.
无论采用哪种解决方案,调试都会很麻烦.我们目前没有很好的解决方案来调试嵌入到我们应用程序中的Lua脚本.由于我们没有在我们的应用程序中使用python,我无法谈论可用的工具,但几年前的情况大致相同 - 调试不佳.使用脚本来扩展功能很不错,但脚本中的错误可能会导致问题,并且可能很难找到.
如果你需要在那里进行更改,那么Lua代码本身就很麻烦.我们已经看到了Lua代码库本身存在的难以追踪的错误.我怀疑Boost :: Python可能有类似的问题.
使用任何脚本语言,它不一定是"非程序员"扩展功能的解决方案.它可能看起来像,但你可能会花费相当多的时间调试脚本甚至可能是Lua.
总而言之,我们对Lua非常满意并且已经在两场比赛中发售了它.我们目前没有计划放弃这种语言.总而言之,我们发现它比几年前提供的其他替代品更好.Python(和IronPython)是其他选择,但根据经验,它们似乎比Lua更加沉重.我很想听听那里的其他经历.
我强烈建议你看看Luabind.这使得将Lua集成到C++代码中变得非常简单,反之亦然.也可以公开在Lua中使用的整个C++类.
你最好的办法是嵌入lua(www.lua.org)或python(www.python.org).两者都用于游戏行业,并且两者都相对容易地访问extern"C"函数,而lua在这里具有优势(因为数据类型更容易在lua和C之间转换).与C++对象的接口在您的最终会有更多的工作,但您可以在Google或lua或python论坛上查找如何执行此操作.
我希望有所帮助!