2010-04-22 39 views
5

Tôi đã viết một số tập lệnh cho một trò chơi, các tập lệnh được viết bằng Lua. Một trong những yêu cầu của trò chơi là phương thức cập nhật trong kịch bản lệnh lua của bạn (được gọi là mọi khung hình) có thể mất không quá 2-3 mili giây để chạy, nếu trò chơi đó bị treo. Tôi đã giải quyết vấn đề này với coroutines, tất cả những gì tôi phải làm là gọi Multitasking.RunTask (SomeFunction) và sau đó nhiệm vụ chạy như một coroutine, sau đó tôi phải phân tán Multitasking.Yield() trong suốt mã của tôi, kiểm tra cách thức dài nhiệm vụ đã được chạy cho, và nếu nó hơn 2 ms nó tạm dừng nhiệm vụ và tiếp tục khung tiếp theo. Điều này là ok, ngoại trừ việc tôi phải phân tán Multitasking.Yield() ở khắp mọi nơi trong suốt mã của tôi, và đó là một mớ hỗn độn thực sự.Lập lịch tác vụ Lua

Lý tưởng nhất, mã của tôi sẽ tự động mang lại khi nó chạy quá lâu. Vì vậy, có thể lấy một hàm Lua như một đối số, và sau đó thực hiện nó theo dòng (có thể giải thích Lua bên trong Lua, mà tôi biết là có thể, nhưng tôi nghi ngờ nó có thể nếu tất cả các bạn có là một con trỏ hàm)? Bằng cách này, tôi có thể tự động kiểm tra thời gian chạy và năng suất nếu cần thiết giữa mỗi dòng.

EDIT :: Để rõ ràng, tôi đang sửa đổi một trò chơi, điều đó có nghĩa là tôi chỉ có quyền truy cập vào Lua. Không cho phép thủ thuật C++.

Trả lời

5

kiểm tra lua_sethook trong Debug Interface.

+0

Có vẻ như nó yêu cầu quyền truy cập vào nguồn C++? – Martin

+0

là C, không phải C++ – Javier

+2

Thư viện 'debug' được xuất từ ​​Lua. Bạn có thể gọi 'debug.sethook()' trực tiếp từ Lua. –

1

Tôi chưa thực sự thử giải pháp này, vì vậy tôi không biết chắc nó sẽ hoạt động tốt như thế nào.

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

Tôi đã chọn số tùy ý; nó sẽ phải được tinh chỉnh cho đến khi nó gần đúng thời hạn bạn cần. Hãy ghi nhớ rằng thời gian dành cho các chức năng C vv sẽ không làm tăng giá trị đếm lệnh, vì vậy một vòng lặp sẽ đạt đến giới hạn này nhanh hơn nhiều so với các cuộc gọi đến các hàm C chạy dài. Nó có thể là khả thi để thiết lập một giá trị thấp hơn nhiều và thay vào đó cung cấp một chức năng mà thấy bao nhiêu os.clock() hoặc tương tự đã tăng lên.

+0

Có lẽ là giải pháp duyên dáng nhất (thực sự, tôi đã thử điều này ban đầu), nhưng tiếc là nó không hoạt động. Xem cuộc thảo luận này http://lua-list.2524044.n2.nabble.com/embedded-lua-in-web-based-REPL-td4766017.html – AlexWebr

Các vấn đề liên quan