使用 Lua C API 5.3 恢复 Lua 脚本

我想使用 Lua C API 5.3 暂停一个脚本,以便稍后恢复它(可能是在从磁盘加载游戏状态后)。我不相信可以安全地使用协程/挂起,因为我正在构建脚本开头的本地变量状态,并且我希望此解决方案在应用程序完全重新启动后也能起作用。本质上,维护原始 Lua 状态对象是不现实的。

示例脚本:

wait(10秒)
dothatlast()

潜在解决方案#1:将整个脚本包装在协程中;但是,整个 Lua 状态必须以某种独特的方式被保存。如果脚本希望在稍后的日期被恢复,从保存的游戏状态或其他地方,这种方法是没有用的。

潜在解决方案#2:我考虑过操作 Lua 脚本,使得任何脚本暂停前后的部分都变成可执行的 Lua 脚本,在第一次运行时执行第一部分,第二个和其他运行都会等待指定的时间,最后一个运行会执行最后一部分。全局变量将用于指示机器状态。

潜在解决方案#3:我可以使用 luaL_dostring() 而不是手动处理脚本,手动处理条件/循环并手动执行单个行。这似乎是最简单和最安全的方法。

大亮点是确保该解决方案适用于嵌套循环。正如我所说,该解决方案需要能够在应用程序重新启动后恢复;在保存和重新加载状态方面。

我想获取社区反馈,看是否有其他解决方案或者社区对任何上述解决方案有什么建议。

谢谢!

点赞
用户33252
用户33252

你还应该考虑使用 lua_sethook。你可以分配一个“钩子函数”,它在每个count个字节码指令执行时调用。当你想暂停脚本时,你的钩子函数可以推迟返回。你需要维护钩子函数的堆栈,以便稍后可以返回,这意味着你已经将问题从Lua协程移动到了C协程或线程中。

2020-08-11 20:24:11