2010-10-31 30 views
7

Như tôi biết, GC theo dõi không thể tránh chặn luồng trong suốt GC hoàn chỉnh.GC và trò chơi thời gian thực của Lua

Tôi đã sử dụng XNA + C# và thời gian GC không thể xóa. Vì vậy, tôi chuyển sang ngôn ngữ cấp thấp hơn C, nhưng tôi nhận ra tôi cần ngôn ngữ kịch bản. Tôi đang xem xét Lua, nhưng tôi lo lắng về cơ chế GC của Lua. Lua đang sử dụng GC theo dõi gia tăng, và chặn luồng cũng phải là quá.

Vậy tôi nên xử lý điều này như thế nào trong trò chơi thời gian thực?

+2

Bạn không viết trò chơi có yêu cầu FPS chặt chẽ bằng ngôn ngữ GC hoặc bạn không tạo đủ rác thải tạo chu kỳ GC mất nhiều thời gian hơn chấp nhận được. Trước tiên hãy thử xem có bất kỳ hit đáng chú ý nào không. – delnan

Trả lời

10

Sức mạnh của Lua là nó thoát ra khỏi con đường của bạn. Muốn lớp học? Điều đó có thể được xây dựng với các siêu dữ liệu. Muốn sandboxing? sử dụng lua_setfenv.

Đối với bộ thu gom rác. Sử dụng nó như là lần đầu tiên. Nếu sau đó bạn tìm thấy các vấn đề hiệu suất, hãy sử dụng lua_gc để tinh chỉnh hành vi của nó.

Một số ví dụ:

  • Vô hiệu hóa thu gom rác trong những thời điểm khi xuống chậm sẽ là một vấn đề.

  • Để bộ thu gom rác bị tắt và chỉ thực hiện bước khi logic trò chơi cho biết bạn có một số phòng đầu vào số FPS của mình. Bạn có thể điều chỉnh trước kích thước bước hoặc khám phá kích thước bước tối ưu khi chạy.

  • Tắt trình thu thập và thực hiện thu thập đầy đủ tại các điểm dừng, tức là màn hình tải hoặc cảnh cắt hoặc lần lượt thay đổi trò chơi ghế nóng.

Bạn cũng có thể xem xét ngôn ngữ kịch bản thay thế. Squirrel cố gắng hết sức để trở thành Lua thế hệ thứ hai. Nó cố gắng giữ tất cả các tính năng tốt của Lua, trong khi bỏ qua bất kỳ sai lầm thiết kế nào của nó. Một trong những khác biệt lớn giữa hai là squirrel uses reference counting thay vì thu gom rác thải. Nó chỉ ra rằng việc đếm tham chiếu có thể chậm hơn một chút so với việc thu gom rác nhưng nó rất xác định (thời gian thực AKA).

+0

Cảm ơn bạn đã trả lời. Đề nghị của bạn 'Squirrel' trông rất ổn. Tôi sẽ đào nó sớm :) – Eonil

3

Các cách chính xác để xử lý này là:

  1. Viết một nguyên mẫu nhỏ chỉ với những điều cốt lõi mà bạn muốn thử nghiệm.
  2. Hồ sơ rất nhiều, tái tạo các kịch bản khác nhau có thể xảy ra trong trò chơi của bạn (rất nhiều bộ nhớ, ít bộ nhớ, số lượng chủ đề khác nhau),
  3. Nếu bạn không tìm thấy nút cổ chai rõ ràng , bạn có thể sử dụng Lua. Nếu không, bạn sẽ phải tìm các giải pháp thay thế (có thể là Lisp hoặc Javascript)
+0

Rất tiếc, vấn đề này không thể tránh được, chỉ có thể giảm. – Eonil

2

Bạn có thể vá Lua GC để hạn chế thời gian cho mỗi chu kỳ thu thập. Ví dụ: http://www.altdevblogaday.com/2011/07/23/predictable-garbage-collection-with-lua/

Tôi tin rằng vẫn có thể có thời gian bước dài GC khi thu thập các bảng rất lớn. Vì vậy, bạn cần phải áp dụng một kiểu lập trình để tránh các bảng lớn.

Bài viết sau đây thảo luận về hai chiến lược sử dụng Lua để điều khiển rô bốt thời gian thực (1. không tạo ra rác hoặc 2.sử dụng trình cấp phát O (1) và điều chỉnh khi thu thập GC được chạy): https://www.osadl.org/?id=1117

+0

Liên kết đầu tiên đã đi 404. May mắn thay nó là một repost và bản gốc vẫn có thể được tìm thấy ở đây: http://kalogirou.net/2011/07/23/predictable-garbage-collection- với-lua / –

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