在C ++应用中实现脚本
我想将我的应用程序的各个部分移动到简单的脚本中,以使那些不了解c ++的人能够编辑和实现各种功能。
因为它是一个实时应用程序,所以我需要对这些脚本进行某种多任务处理。理想情况下,我想要它,以便c ++应用程序调用脚本函数,然后该脚本函数继续运行(在c ++线程下),直到暂停点(Wait(x))或者返回为止。在等待的情况下,需要保存状态,以便在持续时间到期后下次应用程序下次循环时重新启动脚本。
脚本还需要能够调用c ++类方法,理想情况下使用c ++类,而不是围绕c ++类的普通包装函数。
我不想花费大量时间来实现这一点,因此使用现有的脚本语言比编写我自己的脚本语言更可取。我听说Python和Lua可以集成到c ++应用程序中,但是我不知道如何实现我的目标。
- 脚本必须能够调用c ++函数
- 调用某些功能(例如,等待)时,脚本必须能够"暂停",并由c ++线程重新启动
- 需要快速-这是用于实时应用程序,并且可能正在运行许多脚本。
我可以很容易地滚动多任务代码,前提是可以保存并重新启动脚本(可能是通过与原始脚本不同的线程)。
解决方案
回答
看一下Boost.Python库。看起来我们想要做的事情应该相当简单。
回答
我强烈建议我们看看Luabind。将Lua集成到C ++代码中非常容易,反之亦然。也可以公开在Lua中使用的整个C ++类。
回答
我们绝对可以使用Python来完成我们想做的事情。以下是有关将Python嵌入到应用程序中的文档。我很确定Lua也可以工作,但我对此不太熟悉。
我们正在描述协作式多任务处理,其中脚本需要定期调用Break或者Wait函数。也许更好的解决方案是在自己的线程中运行脚本语言,然后在脚本语言与程序其余部分之间的接口上使用互斥体或者无锁队列。这样,没有足够频繁地调用Break()的错误脚本不会意外冻结程序。
回答
最好的选择是嵌入lua(www.lua.org)或者python(www.python.org)。两者都在游戏行业中使用,并且两个访问extern" C"都相对容易,因为lua在此处具有优势(因为数据类型更容易在lua和C之间转换)。与C ++对象进行接口将在工作上做得更多,但是我们可以在Google或者lua或者python论坛上查找如何执行此操作。
希望对我们有所帮助!
回答
我们还可以使用Ch嵌入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更为繁重。我很想听听那里的其他经历。
回答
看看SWIG。我已经使用它与Python进行接口,但是它支持许多其他语言。
回答
对Lua再投一票。它体积小,速度快,不占用太多内存(对于游戏,我们最好的选择是在初始化时分配大缓冲区,然后将所有Lua内存分配重定向到该处)。我们使用tolua来生成绑定,但是还有其他选择,其中大多数选项比boost.python小得多/易于使用(IMO)。
回答
至于调试Lua(如果走那条路),我一直在使用DeCoda,而且还不错。它伪装成一个IDE,但是sorta失败了,但是我们可以将调试过程添加到Visual Studio,然后在断点处调用堆栈。跟踪该错误非常方便。