在尝试并见证了将 Lua 和 LuaJIT 集成到我的游戏引擎中令人难以置信的轻松之后,我确信这就是我想要使用的脚本语言。我想将它用于我的 AI、单位描述、地图触发器等。(尽可能真的)。这个问题不仅适用于gamedev,我可以想象创建一个可以加载外部脚本的脚本编辑器或窗口管理器(例如:带有python和包控制的崇高文本)
但是现在我遇到了一个难题:我真的很欣赏LuaJIT FFI提供的绑定到我的引擎的易用性,但我不想让 FFI 自由支配例如地图作者。通过 FFI(当 JITted 时)进行 lua-to-c 调用的惊人速度也是我真正想要的。
所以理想情况下,我会编写自己的包装 Lua 文件,使用 FFI 绑定到我的引擎,并导出一个不错的模块供地图作者和模组制作者使用。我的替代方法是编写一个香草 lua 模块,这是可能的,但更麻烦和更慢。
编译 luajit 时我无法禁用 FFI,因为显然我想自己使用它,但我看不到如何在每个脚本或每个模块的基础上限制 FFI。显然,FFI 需要在我加载模块的 lua_State 中处于活动状态(之后我无法开始加载用户修改的脚本)。那我该怎么办?甚至可能吗?
编辑:在我看来,理想的工作流程是:
- 打开lua状态
- 加载所有模块(luaL_openlibs()),FFI 也被预加载
- 加载使用 FFI 的我的 .lua 模块(这是引擎绑定,它们是受信任的文件,因此它们可以使用 FFI)
- 禁用选择本机模块和功能:os,ffi,...(这是缺少的步骤)
- 执行用户提供的脚本(这些是不受信任的,我不希望他们访问 FFI)
- 可选:寻找一种方法来重新加载 lua 模块以实现快速编辑周期,这将涉及重新启用 FFI 和其他模块。(也不知道怎么做)
注意:我知道这仍然不是一个完美的(甚至是好的沙盒),正如 Mike Pall 在他的一些邮件中已经指出的那样,但我仍然不想让地图作者访问 FFI。