2009-09-05 42 views
6

Mọi người, có cách nào để sao chép trạng thái Lua không?Nhân bản trạng thái Lua

Trong ứng dụng trò chơi, quy trình khởi tạo của máy ảo Lua khá nặng (khoảng 1 giây, vì nhiều tập lệnh được tải cùng một lúc). Tôi có một Lua VM riêng biệt cho mỗi tác nhân tự trị và một khi tác nhân được tạo ra, việc khởi tạo Lua của nó ảnh hưởng đến FPS khá nặng.

Tôi đang suy nghĩ về lược đồ sau: điều gì về việc giữ trạng thái Lua "tiền tố" mà sau đó được nhân bản đơn giản cho mỗi tác nhân? Có thể không?

+2

Nhiều người viết sai Lua, nó không phải là từ viết tắt. Bạn vui lòng sửa đổi phần trên sao cho nó tuân theo cách đặt tên chuẩn. Chúng tôi cũng không viết PYTHON. Lua chỉ xảy ra là một tên ba chữ cái. Xem: http://www.lua.org/about.html – akauppi

+3

Ồ, xin lỗi vì điều đó. Cảm ơn cho đầu lên. – pachanga

+0

bạn đã bao giờ tìm cách để làm điều này? – DShook

Trả lời

4

Bạn muốn xem xét sử dụng corryines của Lua cho mỗi tác nhân tự trị, thay vì một máy ảo hoàn toàn riêng biệt. Coroutines là một giải pháp nhẹ hơn, nhưng có thể hoặc có thể không phù hợp với ứng dụng của bạn.

Nếu bạn không thể thay đổi kiến ​​trúc, bạn có thể thử LuaJIT. Nó có thể làm cho quá trình khởi tạo đủ nhanh cho mục đích của bạn.

Tùy chọn khác:

  1. Rings: "Nhẫn là một thư viện cung cấp một cách để tạo Lua mới nói từ bên trong Lua Nó cũng cung cấp một cách đơn giản để giao tiếp giữa tác giả (master) và. trạng thái được tạo ra (slave). "

  2. Pluto: "Pluto là thư viện cho phép người dùng viết các phần lớn tùy ý của" vũ trụ Lua "vào một tệp phẳng và sau đó đọc chúng trở lại cùng một vũ trụ Lua khác."

+0

Tôi đã suy nghĩ về việc sử dụng coroutines tuy nhiên tôi sợ một lỗi nghiêm trọng trong một coroutine sẽ ảnh hưởng đến những người khác đó là lý do tại sao nó không phải là tùy chọn atm. Cảm ơn các liên kết! Tôi hiện đang xem LuaJIT và Rings. Nhẫn có vẻ là một giải pháp khả thi cho vấn đề của tôi. – pachanga

+3

Lỗi nghiêm trọng trong một coroutine sẽ không ảnh hưởng đến người khác theo bất kỳ cách nào. Miễn là chúng ta đang nói về mã Lua - người dùng cung cấp các công cụ có thể làm bất kỳ thiệt hại nó được lập trình cho tất nhiên. –

+0

Tôi thực sự cần sao chép một trạng thái. Nó là dành cho một khung POS mà tôi đang làm, và tôi không muốn anh chàng viết kịch bản để có thể ăn cắp mật khẩu thẻ tín dụng. Thư viện EMV cho phép người dùng tùy chỉnh màn hình thông qua các cuộc gọi lại, và mỗi cuộc gọi lại kích hoạt một coroutine lua tải các màn hình. Nhưng coroutines chia sẻ các biến, và tôi muốn tất cả các sửa đổi đối với môi trường biến đổi trong suốt cuộc gọi mật khẩu được khôi phục ... Tôi có nên tạo một câu hỏi mới cho điều này không? –

1

Ngoài ra còn có Lanes (download, docs) và trong comparison cho tất cả các sản phẩm tương tự tôi biết.

Về Nhẫn bảng so sánh nói:

Nhẫn cung cấp riêng biệt Lua khẳng định, nhưng không đa luồng. Điều này làm cho nó đơn giản, nhưng nó sẽ không sử dụng nhiều hơn một lõi CPU .

Lưu ý: Bảng so sánh cho biết Lanes sẽ chỉ sắp xếp các bảng 'không tuần hoàn'. Nó làm chu kỳ, và các chức năng marshall, upvalues ​​vv Và nó không sao chép giữa Lua tiểu bang như bản sao trực tiếp, không cần phải xâu chuỗi các nội dung ở giữa. Điều này làm cho nó nhanh.

1

Nếu bạn đang ở trên Linux, bạn có thể thử lper, LPSM dựa trên thư viện thực nghiệm bởi một trong những tác giả Lua.

+0

Vâng, tôi đang sử dụng Linux, nhờ liên kết! – pachanga

1

Thông báo, làm việc với Lua 5.2 trở lên

Bạn chỉ có thể hạn chế quyền truy cập vào máy ảo này. Tạo một cá thể với tất cả các hàm cần thiết, điều đó sẽ không phụ thuộc vào _G (trạng thái Lua toàn cầu) và sau đó tạo bảng riêng cho từng máy khách. Rằng họ sẽ sử dụng như là không gian tên chung của họ. Đặt bảng dưới dạng _G hiện tại có thể thực hiện thông qua _ENV. Đó là một chủ đề khá khó giải thích trong một bài đăng. Tóm lại, bạn chuẩn bị _G ảo "" cho khách hàng mới của mình và sau đó chỉ cần thay thế _G cho mã của khách hàng. There is where I advice you to start.

Đây là điểm.

local _ENV = t -- change the environment. without the local, this would change the environment for the entire chunk

Chỉ cần loại bỏ local và bạn sẽ thay đổi _ENV cho tất cả các mã tiếp theo. Chúc may mắn với các thí nghiệm!

P. S. đừng quên rằng bạn có thể đặt metatable cho _ENV và _G bảng và cấm thay đổi có thể so sánh. Lua thực sự linh hoạt ở đây.

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