当前位置:  开发笔记 > 编程语言 > 正文

在c ++ app中实现脚本

如何解决《在c++app中实现脚本》经验,为你挑选了3个好方法。

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

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

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

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

脚本必须能够调用c ++函数

脚本必须能够在调用某些函数时"暂停"(例如,等待),并由c ++线程重新启动

需要快速 - 这是一个实时应用程序,可能会运行很多脚本.

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



1> Mark..:

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



2> TrolleFar..:

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



3> Kevin..:

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

我希望有所帮助!


@FireLancer:对于你在08年的任何使用都可能迟了两年,但是既然今天可能会读到这个问题的人回答你的问题:Lua使用协程来做你所描述的.你可以调用"yield()"来暂停一个协程,然后"resume()"恢复你离开的地方.您可以将参数传递给从前一个resume()返回的yield(),并将参数传递给resume(),该参数将传递给正在恢复的相关yield().
推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有