2010-04-22 136 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