代码之家  ›  专栏  ›  技术社区  ›  Martin

lua任务调度

lua
  •  5
  • Martin  · 技术社区  · 16 年前

    我一直在为一个游戏写剧本,剧本是用lua写的。游戏的一个要求是,lua脚本中的update方法(称为every frame)运行的时间可能不超过2-3毫秒,如果它真的运行了,游戏就会挂起。

    我用协程解决了这个问题,我所要做的就是调用multitasking.runtask(somefunction),然后任务作为协程运行,然后在我的代码中散布multitasking.yield(),它检查任务运行了多长时间,如果超过2毫秒,它就会暂停任务并下一帧继续。这没关系,只是我得分散多任务。yield() 到处 在我的代码中,这真是一团糟。

    理想情况下,我的代码在运行太长时间后会自动屈服。那么,是否可以将lua函数作为参数,然后逐行执行它(可能在lua中解释lua,我知道这是可能的,但我怀疑如果您只有一个函数指针的话,这是可能的)?这样,我可以自动检查运行时,并在每一行之间产生(如果需要的话)。

    我正在修改一个游戏,这意味着我只能访问lua。没有C++技巧。

    2 回复  |  直到 14 年前
        1
  •  5
  •   Javier    16 年前

    检查 lua_sethook Debug Interface .

        2
  •  1
  •   MaHuJa    14 年前

    我自己还没有尝试过这个解决方案,所以我不知道它会有多好。

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

    我任意选择了这个数字;它将不得不调整,直到大致达到您需要的时间限制。请记住,在C函数等中花费的时间不会增加指令计数值,因此循环将比调用长时间运行的C函数快得多。设置一个低得多的值并提供一个函数来查看os.clock()或类似的操作系统增加了多少可能是可行的。