如何链接到 Lua 中的回调函数,以便在重新加载脚本时更新回调
How can I link to callback functions in Lua such that the callbacks will be updated when the scripts are reloaded?
我正在使用LuaBind在我的游戏中实现Lua脚本,我不清楚的一件事是在游戏中重新加载脚本的后勤工作。
目前,使用 LuaBind C++类luabind::object
,我直接在使用它们的类中保存对 Lua 回调的引用。然后,我可以使用该对象luabind::call_function
以便从C++代码调用Lua代码。
我还没有测试过这个,但我的假设是,如果我重新加载脚本,那么所有函数都将被重新定义,但对 OLD 函数的引用仍将以C++代码持有的luabind::object
的形式存在。我希望能够将旧的换成新的,而不必为游戏中的每个脚本钩子手动管理它。
如何最好地改变这一点,以便该过程正常工作?
我的第一个想法是不要直接保存对函数的引用,而是保存函数名称,并在每次我们想要调用函数时按名称获取函数。我正在寻找更好的主意!
我的第一个想法是不要直接保存对函数的引用,而是保存函数名称,并在每次我们想要调用函数时按名称获取函数。
如果你的类调用具有已知名称的全局函数,那么这几乎解决了你的问题。无需提前获取参考;它不会产生可衡量的性能差异。我认为call_function
无论如何都支持将函数名称作为字符串传递,对吧?
通常在 Lua 脚本注册回调时存储对函数值的引用。在这种情况下,它比存储名称要好得多,因为它允许Lua脚本注册本地,匿名等函数。
如果你真的必须提前获取价值,就像你现在所做的那样(真的没有理由这样做,但我们会假装这是必要的(,我会添加一层间接。你可以有一个封装全局名称的LuaFunctionReference类。在实例化期间,它获取对全局包含的函数的引用。这些对象可以从维护所有此类引用列表的工厂获取。重新加载脚本时,可以让工厂/管理器/pool/etc.对象遍历引用并让它们自行更新,因此隐藏在整个系统中的类中的所有引用都将更新。
- std::原子加载和存储都需要吗
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 架构决策:返回std::future还是提供回调
- 强制资源管理器重新加载注册表值
- Java:加载带有char **的C DLL,将回调作为参数
- cvLoadImage 不显示新图像并加载以前的图像
- 如何从qmlregistersingletontype的回调中访问QML加载项目
- 我正在尝试使用 Windows 映像组件加载 32 位图像,将其翻转,然后将其再次保存回同一文件中
- 使用新运算符而不是加载的新操作员的弦乐深部副本
- 如果新内容过载但未加载相应的删除,会发生什么情况
- 一个C++客户端无法使用我们新的 COM 注册的 .NET .dll加载,另一个客户端可以正常工作
- 如何链接到 Lua 中的回调函数,以便在重新加载脚本时更新回调
- 在管道中调用时,从 std::cin 加载 pugi::xml_document 失败
- 如何访问加载的映像的各个 R/G/B 组件(较新的 C++ API)
- 将序列化保存到多种存档类型,并防止在使用指针加载时构造新对象
- Qt c++如何在加载新的HTML页面后释放内存
- 在DLL中使用新的Vista线程池API也可以在XP中加载(在XP中不使用线程池代码)
- Wt从http响应回调中添加新的小部件
- 在c++中使用动态加载重新加载一个库