我正在使用LuaBind在我的游戏中实现Lua脚本,其中一件我不清楚的事情就是重新加载脚本的内容。
目前,使用LuaBind C ++类luabind::object
,我直接在使用它们的类中保存对Lua回调的引用。然后我可以使用luabind::call_function
使用该对象来从C ++代码调用Lua代码。
我还没有对此进行过测试,但我的假设是,如果我重新加载脚本,那么所有函数都将被重新定义,但对OLD函数的引用仍将以luabind::object
的形式存在由C ++代码持有。我希望能够将旧版本替换为新版本,而无需为游戏中的每个脚本挂钩管理此内容。
如何更好地改变这个过程?
我的第一个想法是不直接保存对函数的引用,但可能保存函数名称,并且每次我们想要调用时都按名称获取函数。我正在寻找更好的想法!
答案 0 :(得分:2)
我的第一个想法是不直接保存对函数的引用,但可能会保存函数名称,并且每次我们想要调用时都按名称获取函数。
如果您的类调用具有已知名称的全局函数,那么这几乎可以解决您的问题。无需提前获取参考;它不会产生可衡量的性能差异。我认为call_function
支持将函数名称作为字符串传递,对吧?
当Lua脚本正在注册回调时,通常会存储对函数值的引用。在这种情况下,它比存储名称要好得多,因为它允许Lua脚本注册本地,匿名等功能。
如果你真的有提前获取值,正如你现在所做的那样(并且没有理由这样做,但我们会假装它是必要的),我会添加一层间接。您可以拥有一个封装全局名称的LuaFunctionReference类。在实例化期间,它抓取对全局包含的函数的引用。这些对象可以从工厂获得,该工厂维护所有这些引用的列表。当您重新加载脚本时,您可以拥有工厂/经理/池/等。对象遍历引用并让它们自行更新,因此所有隐藏在整个系统中的类中的引用都将被更新。