2011-03-16 43 views
23

Tôi hiện đang xây dựng một máy chủ trò chơi (không phải là công cụ) và tôi muốn nó có thể mở rộng, như hệ thống plugin.
Giải pháp tôi tìm thấy là sử dụng ngôn ngữ kịch bản. Càng xa càng tốt.Ruby vs Lua là ngôn ngữ kịch bản cho C++

Tôi không chắc mình có nên sử dụng Ruby hoặc Lua hay không. Lua dễ nhúng hơn, nhưng Ruby có một thư viện lớn hơn và cú pháp tốt hơn (theo ý kiến ​​của tôi). Vấn đề là, không có cách nào dễ dàng tôi tìm thấy để sử dụng Ruby như ngôn ngữ kịch bản với C++, trong khi nó rất dễ dàng với Lua.

Khó khăn về điều này? Gợi ý để sử dụng Ruby như ngôn ngữ kịch bản (tôi đã thử SWIG, nhưng nó không phải là gần như gọn gàng như sử dụng Lua)?

Cảm ơn.

+5

Nếu bạn nghĩ Lua quá đơn giản, và Ruby quá khó để nhúng, có lẽ bạn nên xem xét Python? – Macke

+2

Nếu bạn đang vạch trần cơ sở mã (đặc biệt là máy chủ), bạn có thực sự muốn có một thư viện lớn không? Bạn có thể dành nhiều nỗ lực hơn để lấy đi các tính năng thư viện nguy hiểm mà người dùng có thể khai thác khi nói đến hộp cát. –

Trả lời

8

Tôi đã sử dụng rộng rãi Lua trong quá khứ.

Luabind thực sự dễ sử dụng, không cần thiết cho máy phát bên ngoài như SWIG, tài liệu rất tuyệt. Thời gian biên dịch vẫn tốt.

Vấn đề lớn nhất tôi đã thấy: lua chủ yếu là ... chỉ ghi. Bạn không thực sự có các lớp, nhưng chỉ mảng kết hợp với một chút đường cú pháp (đối tượng ['key'] có thể được viết object.key), vì vậy bạn dễ dàng kết thúc thêm một 'thành viên' trong một hàm tối nghĩa, hoàn toàn quên về nó, và có phản ứng phụ sau này.

Vì lý do này, và lý do này chỉ, tôi thích Python hơn. Boost :: Python là cơ sở cho Luabind vì vậy cả hai đều có một API tương tự (Luabind được sử dụng để dễ dàng hơn một chút để xây dựng nhưng không còn nữa). Về mặt chức năng, chúng khá tương đương.

Không liên quan trực tiếp: Không có cách nào trong số này có thể được sử dụng một cách đáng tin cậy trong môi trường đa luồng (vì vậy điều này tùy thuộc vào độ phức tạp của máy chủ của bạn).

  • N Chuỗi chủ đề: GIL (Global Interpreter Lock) đang trên đường. Mỗi lần bạn sử dụng một biến trong một chuỗi, nó bị khóa, vì vậy nó sẽ làm hỏng điểm, ngoại trừ các hoạt động I/O dài và các cuộc gọi đến các hàm C.
  • lua có coroutines, nhưng chúng không thể song song.
  • đề Ruby là không thực sự đề, nhưng tương tự như coroutines Lua của

Lưu ý rằng bạn vẫn có thể tạo ra một environement cho mỗi thread, nhưng họ sẽ không có khả năng giao tiếp (trừ trường hợp được một bộ máy C++) . Điều này đặc biệt dễ dàng trong Lua.

+1

Với Lua, điều đa luồng có thể được giải quyết bằng cách sử dụng [LuaLanes] (http://kotisivu.dnainternet.net/askok/bin/lanes/). – jpjacobs

+4

@ Calvin1602 Các phiên bản mới nhất của Ruby (1.9+) sử dụng các chuỗi mức hệ thống thực. Nó vẫn còn có một GIL mặc dù, mà đặt nó trên cơ sở bình đẳng với Python. – dunedain289

+0

@ dunedain289: Rất vui được biết, cảm ơn. @jpjacobs: Tôi biết LuaLanes, nhưng tôi chưa bao giờ thử nó. Cảm thấy một chút "không tự nhiên", nhưng tôi nên cho nó một đi. – Calvin1602

0

Tôi sẽ làm mọi thứ dễ dàng nhất để tìm hiểu/có nhiều người chơi nhất sử dụng nó. Bạn muốn nó càng dễ tiếp cận với khách hàng của bạn càng tốt.

+0

Tại sao số lượng game thủ lại quan trọng? –

5

Bạn có thể quan tâm đến việc tìm hiểu về Squirrel. Tôi tin rằng đó là ngôn ngữ kịch bản được sử dụng bởi Left 4 Dead 2. Nó là tiên tiến hơn lua (sử dụng các đối tượng và các lớp) và có nghĩa là dễ dàng được nhúng vào trong một ứng dụng C++, mà âm thanh giống như chính xác những gì bạn đang tìm kiếm.

+0

Cảm ơn. Có cuốn sách nào về việc nhúng ngôn ngữ Squirrel vào C++ không? – bl00dshooter

+0

Không có gì cho đến nay như tôi biết - đó là một ngôn ngữ kịch bản khá mới. Đừng để '3.0' đánh lừa bạn, nó đã được khoảng từ năm 2004, nhưng đã không được sử dụng nhiều như một số ngôn ngữ kịch bản khác. Các tài liệu (liên kết trên trang chính) có vẻ tốt. – James

10

Tôi đã xem xét việc nhúng Ruby vào C/C++ trước đây và có vẻ như rất khó. Có rất nhiều thách thức bạn sẽ phải đối mặt:

  • Calling vào Ruby từ C/C++ yêu cầu 2 lớp chức năng được viết (một lớp để gọi, và một để bắt ngoại lệ)
  • Calling trở lại C/C++ từ Ruby đòi hỏi sự bình thường SWIG loại công việc
  • Di chuyển dữ liệu qua lại đòi hỏi phải theo dõi cẩn thận phân bổ, vì Ruby sẽ muốn rác thu thập bất cứ điều gì nó có thể

tôi chắc chắn rằng này có thể được thực hiện, nhưng dường như e xtremely khó khăn với tôi, chỉ có thể làm được nếu bạn có thể nhảy vào Ruby trong một tối thiểu của điểm nhập cảnh.

2

Đi cho lua, mặc dù tôi muốn khuyên bạn nên luajit, không chỉ cho tốc độ, nhưng đối với thư viện ffi mới, thúc đẩy liên lạc với tối đa :). Lua cũng có âm sắc của các mô-đun, và những cái mới là rất dễ dàng để tạo ra, điều này làm cho sự thiếu hụt trong stdlib của nó.

1

Một điều mà Lua đã làm cho nó là khả năng đưa dữ liệu giữa C++ (hoặc C) và chính nó rất dễ dàng. Về cơ bản bạn chỉ cần đẩy/popping dữ liệu vào một ngăn xếp để giao tiếp giữa hai người. Có nhiều môi trường Lua và chạy cùng một lúc cũng khá đơn giản (bạn cần có chức năng đó). Mặc dù Lua là một ngôn ngữ thu thập rác, thật dễ dàng để ngăn chặn nó làm như vậy trên dữ liệu cần phải dính xung quanh trong mã C++ của bạn. Tạo ra một hệ thống plugin mở rộng nên dễ dàng với Lua khi bạn đặt nền móng. Trao đổi bổ sung (trong trường hợp này, kịch bản) trong và ngoài thời gian chạy cũng khá tầm thường (mặc dù điều này có thể đúng với Ruby, tôi không đủ quen thuộc với nó để biết).

Một điều cần suy nghĩ là có bao nhiêu công cụ hướng đối tượng bạn muốn tập lệnh của mình có thể xử lý. Lua sử dụng các hàm, bảng, các siêu dữ liệu và các nguyên mẫu để thực hiện lập trình giống OO. Một số người thích nó, một số thì không; cá nhân tôi thấy nó thú vị để sử dụng, nếu một chút clunky ở lần. Không được sử dụng Ruby, tôi không thể nói cho nó, nhưng bạn có thể muốn cân nhắc nhu cầu của bạn để hỗ trợ đối tượng/lớp.

Tôi nghĩ trong trường hợp của bạn, bạn cũng nên cân nhắc tốc độ bạn muốn thiết lập và chạy dự án của mình. Như bạn và những người khác đã lưu ý, Ruby rất khó để nhúng vào C++, trong khi Lua thì không. Thời gian luôn luôn là quý giá và nếu bạn muốn nhận được một cái gì đó làm việc càng sớm càng tốt, Lua có lẽ là đặt cược tốt nhất của bạn.

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