Việc sử dụng các tập lệnh Lua để xác định logic trò chơi cho máy chủ MMO sẽ chậm hơn rất nhiều so với biên dịch trong C ++?


10

Tôi đang sử dụng một hệ thống thực thể cho máy chủ MMO của mình và tôi đã suy nghĩ về việc xác định hành vi của "hành động" bằng cách sử dụng tập lệnh Lua. Máy chủ được viết bằng C ++. Tôi không quen lắm với việc sử dụng tốc độ / bộ nhớ của Lua trong C ++ nhưng tôi đã sử dụng nó để tạo kịch bản cho GUI của máy khách. Việc sử dụng Lua để xác định logic trò chơi ở phía máy chủ có làm giảm hiệu suất rất nhiều không?


Câu trả lời:


20

TL; DR: Lua không có phí, nhưng nếu được sử dụng đúng cách, nó không đáng kể và dễ dàng được giảm nhẹ. Đừng sử dụng nó cho các hoạt động toán học nặng hoặc biến đổi hình học. Bạn có thể sẽ không thấy bất kỳ vấn đề hiệu suất nào khi sử dụng nó để tạo kịch bản cho GUI.

Tôi đã thực hiện một số điểm chuẩn cơ bản về hiệu suất của Lua như một ngôn ngữ kịch bản trò chơi và nó khá nhanh. Sử dụng tolua ++ để liên kết LuaJIT với công cụ trò chơi của tôi, tôi đã sinh ra 2.000 diễn viên, mỗi diễn viên được điều khiển bởi một kịch bản Lua được gọi là mỗi vòng lặp trò chơi (với một đối số theo thời gian). Một nửa trong số các diễn viên có kịch bản đổ xô và nửa còn lại đang thực hiện một bước đi ngẫu nhiên (và được đàn chiên tránh).

Tắt thành phần kết xuất đã cho tôi hơn 400 tick mỗi giây trên Opteron 170 của tôi (2x2.0GHz, mặc dù động cơ của tôi chỉ là một luồng vào thời điểm đó). Tôi tưởng tượng rằng tôi có thể đã vắt kiệt hơn một chút nếu tôi đào sâu và tối ưu hóa, có lẽ chuyển một số công việc nặng nề trở lại C ++. Cập nhật 2000 diễn viên 400 lần mỗi giây vẫn khá ấn tượng và vượt xa mong đợi của tôi vào thời điểm đó.

Bây giờ tôi sử dụng Lua trong tất cả các dự án của mình và nó thực sự chiếm một phần khá lớn trong mã trò chơi thực tế (AI, bố cục / logic GUI, Sự kiện / Tin nhắn). Làm cho trò chơi trở nên thú vị hơn khi bạn có thể nhanh chóng thay đổi thứ gì đó và kiểm tra nó mà không cần phải thoát ra, biên dịch lại và sắp xếp lại. Thỉnh thoảng tôi cũng gặp phải một số vấn đề về hiệu năng, nhưng chúng có thể được giải quyết dễ dàng bằng cách thực hiện lại mã vi phạm trong C ++ (và sau đó gọi nó từ Lua).

Mặc dù hơi lạc đề, các máy chủ của EVE Online được viết gần như hoàn toàn bằng Stackless Python (tôi tin rằng họ trì hoãn hầu hết các hoạt động toán học của họ với một C ++ lib), nặng hơn đáng kể so với Lua, và, dựa trên nghiên cứu cá nhân của tôi và một số có sẵn điểm chuẩn, hiệu suất thấp hơn nhiều so với LuaJIT. Họ quản lý để xử lý 30k + người chơi đồng thời mà không gặp quá nhiều vấn đề. Cấp, họ có rất nhiều phần cứng đắt tiền chạy tất cả, nhưng tôi tin rằng phần lớn chi phí nằm trong cụm cơ sở dữ liệu của họ ...

Lời xin lỗi cho bức tường văn bản.


1
Câu trả lời chính xác! Không cần lời xin lỗi cho một câu trả lời chi tiết như vậy. Tôi nghĩ rằng tôi sẽ dành thời gian để phát triển các "hành động" thành phần được xác định trong Lua và thực hiện một số điểm chuẩn. Cảm ơn!
BarakatX2

2
Điểm nhấn lớn nhất trong các loại hệ thống này thường là phân tích cú pháp các tập lệnh, vì vậy hãy đảm bảo tải trước khi khởi động.
coderanger

đây là một quan điểm tốt. Tôi thực sự biên dịch Lua của mình thành mã byte trước khi đóng gói để phát hành, điều này có thể giảm thời gian tải hơn nữa, mặc dù tôi chưa thực hiện bất kỳ phép đo nào.
Codewaff

Tôi có xu hướng không đồng ý. Trong khi logic trò chơi thông thường là một phần nhỏ của thời gian thực hiện (kết xuất là một con quái vật), thì trong máy chủ MMO, nó là một phần lớn hơn nhiều, do đó tác động sẽ đáng kể hơn nhiều. Tôi có kinh nghiệm với LUAJit và C ++ và trong khi LUAJit thực sự nhanh hơn LUA, nó vẫn chậm hơn rất nhiều so với C ++ (giả sử bạn viết mã C ++ đúng cách). Tôi thừa nhận quy trình làm việc với LUAJit là tuyệt vời nhưng theo tốc độ thì nó sẽ thành công. Bất kể bạn xoay nó như thế nào, các biến trong bảng có tra cứu chuỗi, kiểu động và bộ sưu tập rác đều có giá. LUAJit chậm hơn .NET, nuff nói
Kaj

2

Câu trả lời ngắn gọn: Vâng, vâng.

Câu trả lời dài: Nó phụ thuộc vào mức độ logic của trò chơi, mức độ chạy của nó và mức độ phức tạp của nó và nếu bạn cần chạy nó cho mọi người chơi. Nếu nó rất đơn giản và không lặp lại nhiều, bạn có thể ổn với nó. Nhưng đối với hầu hết các trường hợp sử dụng LUA thay vì C ++ sẽ cho hiệu năng thấp hơn nhiều và sẽ mở rộng quy mô xấu, tất nhiên giả sử rằng mã được thiết kế tốt và tối ưu hóa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.