2010-04-22 5 views
5

J'ai écrit quelques scripts pour un jeu, les scripts sont écrits en Lua. L'une des exigences du jeu est que la méthode Update dans votre script lua (appelée chaque frame) ne dure pas plus de 2-3 millisecondes, si le jeu s'arrête. J'ai résolu ce problème avec les coroutines, tout ce que j'ai à faire est d'appeler Multitasking.RunTask (SomeFunction), puis la tâche fonctionne comme une coroutine, puis je dois disperser Multitasking.Yield() dans mon code, qui vérifie comment La tâche a été exécutée depuis longtemps et, si elle dépasse 2 ms, elle interrompt la tâche et la reprend à la prochaine image. C'est ok, sauf que je dois disperser Multitasking.Yield() partout tout au long de mon code, et c'est un vrai bordel.Lua tâche ordonnancement

Idéalement, mon code céderait automatiquement s'il fonctionnait trop longtemps. Alors, est-il possible de prendre une fonction Lua comme argument, puis de l'exécuter ligne par ligne (peut-être interpréter Lua dans Lua, ce que je sais est possible, mais je doute que ce soit possible! De cette façon, je pourrais vérifier automatiquement l'exécution et céder si nécessaire entre chaque ligne.

EDIT :: Pour être clair, je modding un jeu, ce qui signifie que je n'ai accès qu'à Lua. Pas d'astuces C++ autorisées.

Répondre

5

vérifiez lua_sethook dans le Debug Interface.

+0

Cela semble avoir besoin d'un accès à la source C++? – Martin

+0

c'est C, pas C++ – Javier

+2

La bibliothèque 'debug' est exportée de Lua. Vous pouvez appeler 'debug.sethook()' directement à partir de Lua. –

1

Je n'ai pas encore essayé cette solution pour le moment, donc je ne sais pas avec certitude comment cela fonctionnera.

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

J'ai choisi le numéro arbitrairement; il faudra l'ajuster jusqu'à ce que vous ayez à peu près le temps nécessaire. Gardez à l'esprit que le temps passé dans les fonctions C n'augmentera pas la valeur du compte d'instructions, donc une boucle atteindra cette limite beaucoup plus rapidement que les appels aux fonctions C de longue durée. Il peut être viable de définir une valeur beaucoup plus faible et de fournir à la place une fonction qui voit combien os.clock() ou similaire a augmenté.

+0

Probablement la solution la plus gracieuse (en effet, j'ai essayé cela à l'origine), mais cela ne fonctionne malheureusement pas. Voir cette discussion http://lua-list.2524044.n2.nabble.com/embedded-lua-in-web-based-REPL-td4766017.html – AlexWebr