代码之家  ›  专栏  ›  技术社区  ›  Fire Lancer

在C++应用程序中实现脚本

  •  25
  • Fire Lancer  · 技术社区  · 16 年前

    我想把我的应用程序的各个部分移到简单的脚本中,让那些不具备C++知识的人能够编辑和实现各种特性。

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

    脚本还需要能够调用C++类方法,最好是使用C++类而不是C++类的简单包装器函数。

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

    • 脚本必须能够调用C++函数
    • 当某些函数被调用(例如等待)时,脚本必须能够“暂停”,并且由C++线程重新启动。

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

    9 回复  |  直到 13 年前
        1
  •  26
  •   Mark    16 年前

    您可以使用Lua或Python。Lua比python更“轻量级”。它的内存占用比python小,并且根据我们的经验更容易集成(人们在这一点上的里程可能会有所不同)。它可以支持一组同时运行的脚本。Lua至少支持以您希望的方式停止/启动线程。

    python很不错,但根据我(有限)的经验,我们很难为不同的环境进行编译,而且它相当重。(在我看来)它有一个缺点,那就是需要推进。对于一些人来说,这可能不是问题,但是如果您不需要Boost(或者不使用它),那么您将引入大量代码来让Boost.python正常工作。YMMV。

    我们已经将Lua构建到多个平台(win32、Xbox360和PS3)上的应用程序中。我相信它会在x64上工作。使用Luabind的建议很好。我们最终在两者之间编写了自己的接口,虽然不太复杂,但使用胶水代码将为您节省大量时间,甚至可能会让您感到恼火。

    如果您需要在那里进行更改,那么Lua代码本身就有点混乱。我们在Lua代码库中看到了难以追踪的bug。我怀疑Boost::Python可能有类似的问题。

    总而言之,我们对Lua非常满意,并且已经在两场比赛中发布了它。我们目前还没有计划离开这种语言。总而言之,我们发现它比几年前可用的其他替代品要好。Python(和IronPython)是其他的选择,但根据经验,它们似乎比Lua更严厉。不过我很想听听那里的其他经历。

        2
  •  9
  •   TrolleFar    16 年前

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

        3
  •  5
  •   Kevin    16 年前

    最好嵌入lua(www.lua.org)或python(www.python.org)。两者都在游戏行业中使用,并且都可以相对容易地访问外部“C”函数,而lua在这里具有优势(因为数据类型更容易在lua和C之间转换)。与C++对象的接口将在您的终端上工作多一点,但是您可以在谷歌上查找,或者在Lua或Python讨论论坛上进行这一操作。

    我希望这有帮助!

        4
  •  3
  •   dmazzoni    16 年前

    Here are the docs on embedding Python into an application.

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

        5
  •  2
  •   Ferruccio    16 年前

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

        6
  •  2
  •   Harold Ekstrom    16 年前

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

        7
  •  2
  •   yrp    16 年前

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

        8
  •  2
  •   mark mark    16 年前

    至于调试Lua(如果你这样做的话),我一直在使用DeCoda,而且还不错。它假装是一个IDE,但是sorta失败了,但是您可以将调试过程附加到VisualStudio,并在断点处向下调用堆栈。非常方便追踪那个bug。

        9
  •  1
  •   moswald Jarod42    16 年前

    Ch . 我一直在用它做一个游戏项目,它做得很好。力量和适应性的完美结合。