使用Lua C API 5.3,我想暂停一个脚本,以便稍后能够恢复它(可能是在从磁盘加载游戏状态之后)。我不相信协同例程/ work可以安全地使用,因为我在脚本开始时构建局部变量的状态,并且我希望这个解决方案在应用程序完全重新启动后工作。从本质上讲,维护原始的Lua状态对象是不现实的。
示例脚本:
dothisfirst()
wait(10 seconds)
dothatlast()潜在的解决方案#1:将整个脚本包装在一个协同例程中;但是,必须以某种独特的方式保存整个Lua状态。这在脚本希望在以后的日期从保存的游戏状态或其他状态恢复的情况下是不有用的。
可能的解决方案#2:我已经考虑过操纵Lua脚本,因此任何脚本暂停之前和之后的部分都会变成一个可以多次执行的Lua脚本,其中第一次运行时它会执行第一部分,第二次运行时将等待指定的时间,最后一次运行将完成最后一部分。将使用全局变量来指示机器的状态。
可能的解决方案#3:代替使用luaL_dostring(),我可以对脚本进行预处理,手动处理条件/循环,并手动执行单独的行。这似乎是最简单、最安全的方法。
最大的问题是确保解决方案与嵌套循环一起工作。如上所述,解决方案需要能够在应用程序重新启动后恢复;因为可以保存和重新加载状态。
我想我是希望从社区得到反馈,关于是否有其他解决方案,或者社区是否有任何接近上述任何解决方案的建议。
谢谢!
发布于 2020-08-12 04:24:12
您还应该考虑使用lua_sethook。您可以分配一个“钩子函数”,它被称为每个count字节码指令。当你想暂停脚本时,你的钩子函数可以推迟返回。您将需要维护钩子函数的堆栈,以便它稍后可以返回,这意味着您已经将问题从Lua协程转移到C协程或线程。
https://stackoverflow.com/questions/63365401
复制相似问题