【问题标题】:How to implement native scripting with c++如何使用 C++ 实现本机脚本
【发布时间】:2021-05-27 11:10:07
【问题描述】:

我想用实体组件系统来实现脚本系统,就像在 Unity 或 Unreal Engine 4 中一样。我用 c++ 编写了我的引擎,并希望使用 c++ 作为脚本语言。现在我正在寻找以某种二进制格式存储脚本类的方法,所以我的引擎加载它们,创建实例并使用所需的方法。我知道dll可以用于这个目的,但是有几个问题:你需要编写函数调用约定,(dllimport)等,你不能直接创建类的实例,你需要编写一个函数,它将在您的脚本中创建类的实例。那么如何避免这个问题呢?我知道可以使用宏进行调用约定以使代码更清晰,就像 UE4 一样,但是是否可以在我的引擎中直接创建类的实例而不使用 dll 中的特殊函数?或者有没有其他可以编译c++的用户脚本二进制格式?

【问题讨论】:

    标签: c++ scripting game-engine


    【解决方案1】:

    既然要使用c++作为脚本语言,或许可以参考ROOT项目中的C++解释器clinghttp://root.cern.ch/

    cling 是 C++ 的解释器,可能对您的项目有帮助。

    【讨论】:

    • 这是一个有趣的想法,但我认为解释 c++ 会有点慢,这不适合 gamedev。另外,将来我想编译需要二进制代码类的游戏。也许解释器可以调试解决方案。但是想法)
    【解决方案2】:

    TL;DR

    是的,有一些库可以帮助您将 C++ 用作解释器。

    长答案

    理论上,C++ 是编译语言,而不是 Lua 那样的解释语言。但有些开源库并非不可能,“运行时链接器检测源代码文件的更改、编译它们并将它们链接回正在运行的应用程序,同时修补所有更新的函数以跳转到新代码”。

    对于特定操作系统:

    对于跨平台:

    我建议使用其他语言作为解释器语言。

    我对一些解释器语言有些痛苦,很难将它们的解释器或 JIT (Just-In-Time) 或 AOT (Ahead-Of-Time) 编译器集成到引擎中。可能 Lua 是游戏的更好选择(易于学习,比编译语言更快地构建原型,比其他解释器语言更快地集成到引擎)。

    开发使用官方 Lua 库,a question in StackOverflow guide how to integrate this

    如果您关心 Lua 的性能,请改用 lua-aot

    【讨论】:

    • 感谢您的回答。但我不想使用 c++ 作为解释语言,而是我正在寻找以 dll 之类的格式存储类代码但没有调用约定和类导入问题的方法,或者为 dll 编写一些宏和基类,这将允许用户只编写类没有 dll 的实现。
    猜你喜欢
    • 1970-01-01
    • 2020-03-23
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 2010-09-08
    • 2011-11-05
    相关资源
    最近更新 更多