Lua任务调度

我在写一些用Lua编写的游戏脚本。游戏有一个要求,你的lua脚本中的Update方法(在每个帧中调用)的运行时间不能超过2-3毫秒,否则游戏就会卡住。我通过协程解决了这个问题,只需要调用Multitasking.RunTask(SomeFunction),任务就作为协程运行,我只需在代码中分散使用Multitasking.Yield(),它会检查任务运行的时间,如果超过2毫秒,它会暂停任务,并在下一帧恢复它。这样是可以的,除了我不得不在我的代码中到处使用Multitasking.Yield(),而且非常混乱。理想情况下,我的代码应该在运行太长时间时自动yield。那么,是否可能以Lua函数的形式作为参数,然后逐行执行它(可能在Lua内部解释Lua,我知道这是可能的,但如果你只有一个函数指针,我很怀疑它是否可能)?这样一来,我可以在每一行之间自动检查运行时间并进行yield。编辑:明确一下,我正在制作游戏mod,这意味着我只能使用Lua。不能使用C++的技巧。

原文链接 https://stackoverflow.com/questions/2687526

点赞
stackoverflow用户11649
stackoverflow用户11649

请查看调试接口中的 lua_sethook

2010-04-22 01:18:10
stackoverflow用户147749
stackoverflow用户147749

我还没有尝试过这个解决方案,所以我不确定它能否很好地工作。

debug.sethook(coroutine.yield,"",10000);

我随意选择了这个数字; 必须进行微调,直到大致满足您的时间限制。请记住,花费在C函数等中的时间不会增加指令计数值,因此循环会比调用长时间运行的C函数更快地达到此限制。设置一个更低的值并提供一个函数,以查看os.clock()或类似函数的增加量,可能是可行的。

2011-12-16 14:50:59