2010-04-22 133 views
5

我一直在为游戏编写一些脚本,脚本是用Lua编写的。游戏要求之一就是你的lua脚本中的Update方法(每帧被称为)可能不会超过2-3毫秒,如果游戏刚刚结束。我只需要调用Multitasking.RunTask(SomeFunction),然后任务作为协程运行,然后我必须在我的代码中分散Multitasking.Yield(),它会检查任务已经运行了很长时间,如果超过2毫秒,它会暂停任务并在下一帧恢复。这是好的,除了我必须在整个代码中分散Multitasking.Yield()无处不在,而且这真是一团糟。Lua任务调度

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

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

回答

5

检查lua_sethookDebug Interface

+0

这看起来好像需要访问C++源代码? – Martin 2010-04-22 01:47:16

+0

它是C,而不是C++ – Javier 2010-04-22 03:59:31

+2

''调试'库是从Lua中导出的。你可以直接从Lua调用'debug.sethook()'。 – 2010-04-22 04:13:10

1

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

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

我随便挑选了这个数字;它将不得不被调整,直到它大致是你需要的时间限制。请记住,花在C函数等上的时间不会增加指令计数值,因此循环将比调用长时间运行的C函数快得多。设置一个低得多的值可能是可行的,而是提供一个函数来看看os.clock()或类似的增加了多少。

+0

可能是最优美的解决方案(的确,我最初尝试过),但不幸的是它不起作用。请参阅此讨论http://lua-list.2524044.n2.nabble.com/embedded-lua-in-web-based-REPL-td4766017.html – AlexWebr 2012-05-02 20:25:39