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++.
Esto parece que requiere acceso a la fuente C++? – Martin
es C, no C++ – Javier
La biblioteca 'debug' se exporta desde Lua. Puede llamar a 'debug.sethook()' directamente desde Lua. –