2010-04-22 22 views
5

He estado escribiendo algunos scripts para un juego, los scripts están escritos en Lua. Uno de los requisitos que tiene el juego es que el método de actualización en su script lua (que se llama cada fotograma) no demore más de 2-3 milisegundos en ejecutarse, si es que el juego simplemente se cuelga.Lua task scheduling

Resolví este problema con coroutines, todo lo que tengo que hacer es llamar a Multitasking.RunTask (SomeFunction) y luego la tarea se ejecuta como una corutina, luego tengo que dispersar Multitasking.Yield() a través de mi código, que comprueba cómo La tarea se ha estado ejecutando durante mucho tiempo, y si es más de 2 ms, pausa la tarea y la reanuda. Esto está bien, excepto que tengo que dispersar Multitasking.Yield() en todas partes a lo largo de mi código, y es un verdadero desastre.

Lo ideal es que mi código ceda automáticamente cuando ha estado funcionando demasiado tiempo. Entonces, ¿es posible tomar una función Lua como argumento, y luego ejecutarla línea por línea (quizás interpretar a Lua dentro de Lua, que sé que es posible, pero dudo que sea posible si todo lo que tienes es un puntero a la función)? De esta forma, podría verificar automáticamente el tiempo de ejecución y ceder si es necesario entre cada línea.

EDIT :: Para ser claro, estoy modding un juego, eso significa que solo tengo acceso a Lua. No se permiten trucos en C++.

Respuesta

5

cheque lua_sethook en el Debug Interface.

+0

Esto parece que requiere acceso a la fuente C++? – Martin

+0

es C, no C++ – Javier

+2

La biblioteca 'debug' se exporta desde Lua. Puede llamar a 'debug.sethook()' directamente desde Lua. –

1

No he probado esta solución todavía, así que no estoy seguro de qué tan bien funcionará.

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

Elegí el número arbitrariamente; Tendrá que modificarse hasta que sea aproximadamente el límite de tiempo que necesita. Tenga en cuenta que el tiempo dedicado a las funciones C, etc. no aumentará el valor de conteo de instrucciones, por lo que un bucle llegará a este límite mucho más rápido que las llamadas a funciones C de larga ejecución. Puede ser viable establecer un valor mucho más bajo y, en su lugar, proporcionar una función que vea cuánto ha aumentado os.clock() o similar.

+0

Probablemente la solución más elegante (de hecho, lo intenté originalmente), pero desafortunadamente no funciona. Vea esta discusión http://lua-list.2524044.n2.nabble.com/embedded-lua-in-web-based-REPL-td4766017.html – AlexWebr