0

我正在使用 LuaBind 在我的游戏中实现 Lua 脚本,我不清楚的一件事是在游戏中重新加载脚本的后勤工作。

目前,使用 LuaBind C++ 类luabind::object,我将对 Lua 回调的引用直接保存在使用它们的类中。然后我可以使用luabind::call_function该对象从 C++ 代码中调用 Lua 代码。

我还没有对此进行测试,但我的假设是,如果我重新加载脚本,那么所有函数都将被重新定义,但对旧函数的引用仍将以luabind::objectC++ 代码所持有的形式存在。我希望能够将旧的换成新的,而不必为游戏中的每个脚本挂钩手动管理它。

如何最好地改变这一点,使过程有效?

我的第一个想法是不要直接保存对函数的引用,而是可能保存函数名,并在每次我们想调用它时按名称获取函数。我正在寻找更好的想法!

4

1 回答 1

2

我的第一个想法是不要直接保存对函数的引用,而是可能保存函数名,并在每次我们想调用它时按名称获取函数。

如果您的类正在调用具有已知名称的全局函数,那么这几乎可以解决您的问题。无需提前获取参考资料;它不会产生可衡量的性能差异。我认为call_function无论如何都支持将函数名作为字符串传递,对吗?


当 Lua 脚本注册回调时,您通常会存储对函数值的引用。在这种情况下,它比存储名称要好得多,因为它允许 Lua 脚本注册本地、匿名等函数。


如果你真的必须提前获取价值值,就像你现在所做的那样(实际上没有理由这样做,但我们会假装它是必要的),我会添加一层间接性。你可以有一个封装了全局名称的 LuaFunctionReference 类。在实例化期间,它获取对全局包含的函数的引用。这些对象可以从维护所有此类引用列表的工厂获取。当您重新加载脚本时,您可以拥有工厂/管理器/池/等。对象遍历引用并让它们自己更新,因此整个系统中隐藏在类中的所有引用都将被更新。

于 2012-05-04T19:21:55.947 回答