2011-01-15 32 views
6

Tôi đang viết một trò chơi bằng javascript và để ngăn chặn gian lận, tôi đang chơi trò chơi trên máy chủ (đó là trò chơi trên bàn như một người kiểm tra phức tạp hơn). Kể từ khi trò chơi là khá phức tạp, tôi cần phải lưu trữ các gamestate để xác nhận hành động của khách hàng.node.js lưu trữ gamestate, làm cách nào?

Có thể lưu trữ trò chơi trong bộ nhớ không? Đó là thông minh? Tôi nên làm thế? Nếu vậy, làm thế nào? Tôi không biết nó sẽ hoạt động ra sao.

Tôi cũng có thể lưu trữ bằng redis. Và thứ đó khá quen thuộc với tôi và không cần giải thích. Nhưng nếu tôi lưu trữ trong redis, vấn đề là trên mỗi di chuyển duy nhất, trò chơi sẽ cần phải nhận được dữ liệu từ redis và giải thích và phân tích dữ liệu đó để tạo lại các gamestate từ đầu. Nhưng kể từ khi di chuyển xảy ra rất thường xuyên này có vẻ rất ngu ngốc với tôi.

Tôi nên làm gì?

+1

Điều này thực sự không liên quan gì đến JavaScript. Về cơ bản, bạn chỉ cần một máy chủ có thể xử lý tất cả các máy khách được kết nối khác nhau và vì một chương trình thực hiện trong bộ nhớ, nó sẽ nhanh chóng! Chỉ lưu trạng thái trò chơi vào cơ sở dữ liệu nếu bạn cần "lưu" trò chơi. Đại diện cho trạng thái trò chơi của bạn trong mã! –

+0

@Marcus cảm ơn, tôi xin lời khuyên về việc triển khai vì nó không rõ ràng đối với tôi. Làm cách nào để thể hiện trạng thái trò chơi bằng mã? – expressnoob

+0

@expressnoob biến và lớp học. Đây là những công cụ, sử dụng chúng để đại diện cho các đối tượng trong trò chơi của bạn, chẳng hạn như 'Game',' Player', 'Piece' vv. Thiết kế là tùy thuộc vào bạn và cụ thể cho trò chơi của bạn. –

Trả lời

4

Nếu bạn thực sự, thực sự không muốn những phí của I/O sau đó chỉ cần lưu trữ các trạng thái trò chơi trong một đối tượng toàn cầu keyed bởi các trò chơi id:

var global_gamesate = {} 

Sau đó, trên mỗi kết nối kiểm tra những gì các trò chơi id là để truy xuất trạng thái trò chơi của anh ấy:

var gamestate = global_gamestate[game_id]; 

Có lẽ bạn đã có cơ chế để ánh xạ phiên khách hàng đến id trò chơi.

Thông thường, trạng thái trò chơi nhỏ và khó có thể chiếm nhiều RAM. Hãy bi quan và giả sử mỗi trạng thái trò chơi chiếm 500K. Sau đó, bạn có thể phục vụ hai số triệu nghìn trò chơi (bốn triệu nghìn người dùng nếu chúng tôi giả định hai người dùng trên mỗi trò chơi) cho mỗi gigabyte RAM trên máy chủ của bạn.


Tuy nhiên, tôi muốn chỉ ra rằng cơ sở dữ liệu như MySQL đã thực hiện bộ nhớ đệm (đó là cấu hình) để tải các dữ liệu thường xuyên nhất được sử dụng về cơ bản tải từ bộ nhớ RAM với ổ cắm nhỏ I/O trên đầu. Ưu điểm của cơ sở dữ liệu là bạn có thể có nhiều dữ liệu hơn bạn có RAM vì chúng lưu trữ phần còn lại trên đĩa.

Nếu chương trình của bạn bao giờ đạt đến tải mà bạn bắt đầu nghĩ đến việc viết thuật toán tuần tự đĩa để thực hiện một tệp hoán đổi thì về cơ bản bạn đang phát minh lại bánh xe. Trong trường hợp đó tôi muốn nói đi với cơ sở dữ liệu.

+0

Điều gì về đồng thời? Nếu hai khách hàng muốn thay đổi cùng một trạng thái trò chơi toàn cầu cùng một lúc, họ sẽ không can thiệp lẫn nhau và làm hỏng nhà nước? – Jeena

+0

Javascript không có chủ đề và do đó không hỗ trợ đồng thời "thực". Tất cả các mã là nguyên tử với ranh giới quá trình đang bước vào vòng lặp sự kiện (sau dòng cuối cùng của một tập lệnh, nhập vào setTimeout/setInterval, callback ajax, vv). Các luồng công việc hỗ trợ người phiên dịch mới hơn, nhưng trong mô hình đó tất cả các luồng chỉ có thể tương tác qua vòng lặp sự kiện, do đó không có vấn đề đồng thời vì các chủ đề không được phép chia sẻ các biến toàn cầu (mỗi luồng có phạm vi toàn cục riêng) – slebetman

+0

trạng thái của máy chủ (tất cả tiến trình của trò chơi và người dùng của họ) khi tải lại chẳng hạn? – Herokiller

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