2010-04-22 14 views
5

Pisałem kilka skryptów do gry, scenariusze pisane są w języku Lua. Jednym z wymagań gry jest to, że metoda Aktualizacji w twoim skrypcie lua (która nazywa się każdą klatką) może trwać nie dłużej niż 2-3 milisekundy, jeśli gra się zawiesi.Planowanie zadania Lua

Rozwiązałem ten problem z Coroutines, wszystko, co muszę zrobić, to zadzwonić Multitasking.RunTask (SomeFunction), a następnie zadanie działa jako coroutine, muszę następnie rozproszyć Multitasking.Yield() w całym moim kodzie, który sprawdza, jak długo zadanie jest uruchomione, a jeśli jest to ponad 2 ms, zatrzymuje zadanie i wznawia je w następnej klatce. Jest to ok, z wyjątkiem tego, że muszę rozproszyć Multitasking.Yield() wszędzie w całym moim kodzie, i to jest prawdziwy bałagan.

Idealnie, mój kod automatycznie ulegałby wyczerpaniu, gdyby działał zbyt długo. Czy możliwe jest przyjęcie funkcji Lua jako argumentu, a następnie wykonanie jej linia po linii (może interpretacja Lua w Lua, co, jak wiem, jest możliwe, ale wątpię, czy to możliwe, jeśli wszystko, co masz, jest wskaźnikiem funkcji)? W ten sposób mogłem automatycznie sprawdzić czas pracy i wydajność, jeśli to konieczne, między każdą linią.

EDYTOWANIE: Aby było jasne, modyfikuję grę, co oznacza, że ​​mam tylko dostęp do Lua. Żadne sztuczki C++ nie są dozwolone.

Odpowiedz

5

sprawdź lua_sethook w Debug Interface.

+0

Wygląda na to, że wymaga dostępu do źródła C++? – Martin

+0

to C, nie C++ – Javier

+2

Biblioteka 'debugowania' jest eksportowana z Lua. Możesz wywołać 'debug.sethook()' bezpośrednio z Lua. –

1

Sam w rzeczywistości nie wypróbowałem tego rozwiązania, więc nie wiem na pewno, jak dobrze to będzie działać.

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

Wybrałem numer arbitralnie; będzie musiała zostać zmodyfikowana, dopóki nie będzie to w przybliżeniu wymaganym czasem. Należy pamiętać, że czas spędzony w funkcjach C itp. Nie zwiększy wartości liczby instrukcji, więc pętla osiągnie ten limit znacznie szybciej niż wywołania długo działających C funkcji. Może być opłacalne ustawienie niższej wartości, a zamiast tego zapewnienie funkcji, która dostrzega, jak dużo os.clock() lub podobnego wzrosła.

+0

Prawdopodobnie najbardziej zgrabne rozwiązanie (faktycznie, próbowałem tego oryginalnie), ale to niestety nie działa. Zobacz tę dyskusję http://lua-list.2524044.n2.nabble.com/embedded-lua-in-web-based-REPL-td4766017.html – AlexWebr