【问题标题】:Lua task schedulingLua任务调度
【发布时间】:2011-02-10 20:46:30
【问题描述】:

我一直在为游戏编写一些脚本,这些脚本是用 Lua 编写的。游戏的要求之一是,如果游戏只是挂起,lua 脚本中的 Update 方法(每帧调用一次)可能需要不超过 2-3 毫秒的时间来运行。

我用协程解决了这个问题,我所要做的就是调用 Multitasking.RunTask(SomeFunction) 然后任务作为协程运行,然后我必须在我的代码中分散 Multitasking.Yield(),它检查多长时间任务一直在运行,如果超过 2 毫秒,它会暂停任务并在下一帧恢复。这没关系,除了我必须在整个代码中分散 Multitasking.Yield() 任何地方,这真是一团糟。

理想情况下,我的代码在运行时间过长时会自动生成。那么,是否可以将 Lua 函数作为参数,然后逐行执行(也许在 Lua 中解释 Lua,我知道这是可能的,但我怀疑如果你只有一个函数指针,这是否可能)?通过这种方式,我可以在每一行之间自动检查运行时并在必要时产生。

编辑:: 明确地说,我正在修改游戏,这意味着我只能访问 Lua。不允许使用 C++ 技巧。

【问题讨论】:

    标签: lua


    【解决方案1】:

    我自己还没有真正尝试过这个解决方案,所以我不确定它的效果如何。

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

    我随意选了号码;必须对其进行调整,直到大致达到您需要的时间限制。请记住,花在 C 函数等上的时间不会增加指令计数值,因此循环会比调用长时间运行的 C 函数快得多。设置一个低得多的值可能是可行的,而是提供一个函数来查看 os.clock() 或类似的增加了多少。

    【讨论】:

    【解决方案2】:

    Debug Interface 中检查lua_sethook

    【讨论】:

    • 这看起来需要访问 C++ 源代码?
    • debug 库是从 Lua 导出的。你可以直接从 Lua 调用debug.sethook()
    • @Norman,太好了,这看起来很有希望。 @Javier,您能否详细说明如何使用它,我对 C 不是很熟悉,所以文档有点神秘。
    猜你喜欢
    • 1970-01-01
    • 2012-08-30
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多