Tôi tin rằng vấn đề của bạn là loại trò chơi và dữ liệu.
này lại được chia thành:
- tốc độ máy chủ (tính toán cần trong CPU + RAM yêu cầu cho thế giới/máy nghe nhạc dữ liệu)
- tốc độ kết nối (băng thông trên máy chủ)
- kích thước dữ liệu (như thế nào cần nhiều thông tin và mức độ thường xuyên)
- biểu mẫu tương tác của người chơi (sự kiện hoặc FPS)
- khoảng cách từ máy khách đến máy chủ (ping)
MMORG
Ví dụ. World Of Warcraft, là kiến thức của tôi về thế giới không có PVP bằng cách sử dụng "client là viewport" và "client gửi keystrokes", "server xác thực và thực hiện, và cho client biết điều gì xảy ra" trên cơ sở CLIENT-SERVER.
Điều này mang lại cho trò chơi nhiều thời gian chờ chấp nhận được vì bạn chỉ cần chuyển lệnh từ ứng dụng khách và sau đó là kết quả cho khách hàng. Phần còn lại được vẽ trên máy khách.
Sự kiện rất được điều khiển và từ bạn nhấp vào biểu tượng hoặc nhấn phím, không sao khi "lỗi chính tả" của bạn cần thời gian để kích hoạt trên máy chủ. Thứ hai là không có va chạm người chơi cần thiết.Điều này cho phép máy chủ xử lý ít dữ liệu hơn và giữ các yêu cầu đối với CPU máy chủ nhỏ hơn.
Counter-Strike/Battlefield, vv
FPS, hành động nhịp độ nhanh, với phản ứng nhanh chóng nhu cầu để có được thông tin về tất cả các chi tiết tất cả các thời gian. Điều này làm cho nhu cầu về độ chính xác cao hơn. Va chạm là phải cho cả người chơi và vũ khí.
Loại trò chơi này thường không xử lý hơn 32 người chơi trên một bản đồ, vì tất cả chúng đều cần chia sẻ vị trí, đạn, vụ nổ, v.v ... và tất cả dữ liệu này phải đi qua máy chủ- xác nhận lại là một nút cổ chai cho bất kỳ loại trò chơi trực tuyến nào.
Độ trễ mạng
Trong một thế giới hoàn hảo này sẽ là 0 ms, nhưng như chúng ta đều biết. Tất cả phần cứng từ máy khách đến máy chủ và ngược lại cần có thời gian. Cả hai đi qua các ngăn xếp mạng và thông qua kết nối internet (switch, router, modem, trung tâm cáp vv) vì vậy cách nhiều trò chơi thời gian thực hiện đại sửa lỗi này là do "dự đoán". Hãy để máy chủ nhìn vào hướng và tốc độ của bạn. Sau đó, họ cố gắng dự đoán (giống như GPS trong đường hầm) mà bạn được nhìn thấy lần cuối cùng với tốc độ +4 vì vậy khung thời gian bạn đã di chuyển (khung thời gian x 4) - nhưng nếu bạn đã làm chậm hoặc tăng tốc lên? sau đó họ ngay lập tức "hyperjump" bạn từ A đến B trong một giây và bạn cảm thấy như một trò chơi tụt hậu hoặc họ dễ dàng đến vị trí thực sự để "anh hùng" của bạn trượt nhanh hơn hoặc chậm hơn vào đúng sở hữu.
Kỹ thuật này được giải thích nhiều nơi trên mạng, vì vậy không cần chi tiết ở đây, nhưng phải mất thời gian và tinh chỉnh để có được hiệu suất tốt - nhưng nó hoạt động và tiết kiệm rất nhiều đau đầu cho người lập trình.
Cần có dữ liệu mạng nào?
Tôi đọc câu hỏi và suy nghĩ của bạn: có thể được nén khá nhiều. Thứ hai, tôi đã thực hiện một cuộc trò chuyện Flash socket với ByteStream thuần túy và nó hoạt động rất tốt. Thật khó để chạy cho một sự khởi đầu, nhưng một khi tôi đã nhận nó và chạy nó đã được nhanh chóng.
Trình khách flash/trình phát chính nó không phải là ứng dụng khách mạng lớn nhất, vì vậy, mong đợi rất nhiều tốc độ bị mất ở đó. Tôi sẽ đi 10-15 fps cho phần mạng và sau đó sử dụng phương pháp tiếp cận RAW nhiều hơn cho dữ liệu được gửi qua lại.
Cuối cùng, hãy cố gắng giữ dữ liệu càng đơn giản càng tốt.
Ví dụ: sử dụng COMMANDS/SHORTCUTS cho dữ liệu/sự kiện nhất định. Giống như một dữ liệu máy chủ bytestring có thể là: 0x99, 0x45,0x75,0x14,0x04,0x06
đâu 0x99 có nghĩa là: NỔ LỚN tại COORDS sau: (0x45,0x75) Sau đó 0x14 có nghĩa là: PLAYER 0x14 (máy nghe nhạc 20 theo số thập phân) đã chuyển sang (0x04, 0x06)
Vì vậy, mã vạch nhìn chằm chằm cho trình xử lý giao thức mạng trong máy khách và máy chủ của bạn những gì sẽ xảy ra tiếp theo. (Cách CPU biết cách đọc bộ nhớ btw.)
Đối với cuộc trò chuyện của mình, tôi có các lệnh cho từng loại dữ liệu được phân tích cú pháp. Một cho đăng nhập, một cho phát sóng, cho biết tên của một người sử dụng vvVì vậy, khi khách hàng đã đăng nhập, khách hàng đã nhận được lệnh + một nhóm người dùng trực tuyến. Điều này chỉ được chuyển một lần cho khách hàng. Sau đó, mỗi khách hàng được đính kèm cũng nhận được lệnh "người dùng mới trực tuyến" với tên của người dùng mới. Mỗi khách hàng duy trì danh sách riêng của mình với người dùng hiện tại và ID để tôi chỉ cần cho biết số khách hàng nào nói văn bản. Điều này giữ lưu lượng truy cập ở mức tối thiểu. Tương tự như vậy sẽ đi cho tọa độ hoặc lệnh của những gì để làm. "Player # 20 đi về phía bắc" vv có thể được 0x14, 0x41, 0xF0 (0x41 có thể là MOVE, 0xF0 có thể NORTH, EAST 0xf1, vv)
này khoảng cách vật lý vào trò chơi
Điều này bạn không thể thay đổi, nhưng bạn có thể đặt trong một số hạn chế hoặc làm cho các máy chủ chạy ở nhiều địa điểm trên toàn thế giới, tùy thuộc vào loại trò chơi bạn muốn thực hiện. Amazon EC2 là một nền tảng tuyệt vời cho các dự án như họ có trung tâm dữ liệu trên toàn thế giới và sau đó bạn có thể đánh giá mạng người dùng dựa trên các mạng này và sau đó chuyển hướng người dùng đến trung tâm dữ liệu gần nhất nơi bạn đang chạy máy chủ.
Hacking/gian lận
Cũng nên nhớ, nếu một cái gì đó trở nên phổ biến và bạn bắt đầu kiếm tiền trên đó, sớm hay muộn ai đó sẽ cố gắng phá vỡ các giao thức hoặc phá vỡ các tài khoản để truy cập vào máy chủ, thông tin hoặc gian lận để nhận thêm các mục/điểm trong trò chơi. Bạn cũng có thể bị tấn công bởi DDOS, nơi họ đánh bom mạng của bạn với dữ liệu sai chỉ để làm hỏng mọi thứ và khiến trò chơi không sử dụng được.
Đừng bận tâm quá nhiều khi bắt đầu, chỉ cần nhớ rằng khi bạn lên mạng, bạn KHÔNG BAO GIỜ biết ai trên thế giới hoặc ở đâu trên thế giới. Tôi không cố gắng làm cho bạn hoang tưởng, nhưng có những người bệnh sẽ cố gắng kiếm tiền bằng cách gian lận người khác.
Vì vậy, hãy nghĩ điều này vào cấu trúc của bạn, không hiển thị dữ liệu trong các gói mạng không cần thiết. Không tin dữ liệu từ khách hàng luôn đúng. Xác thực dữ liệu ở phía máy chủ.
Điều này cũng cần thời gian nếu bạn có 100 người chơi đang hoạt động cùng một lúc.
Nhưng một khi bạn làm điều đó, bạn có thể ngủ ngon hơn nhiều nếu nó trở thành một thành công lớn cho bạn, điều mà tôi thực sự hy vọng.
Đó là suy nghĩ của tôi từ kinh nghiệm. Hy vọng một số của nó có thể là hữu ích eventhough tôi didnt khá trả lời nếu 100 người chơi có thể.
Infact Tôi sẽ nói: CÓ 100 người chơi là có thể, nhưng nó phụ thuộc nếu tất cả họ di chuyển cùng một lúc và có thử nghiệm thu nhỏ liên quan và nếu bạn chấp nhận trễ hay không.
Máy chủ có gửi dữ liệu đến các máy khách khác qua máy chủ không? Sau đó, khách hàng đang nhận được thời gian chuyến đi đôi vòng so với nếu máy chủ tính toán vật lý. – alxx
Sự khác biệt duy nhất từ 1client-> server-> 3client đến server-> 4clients là có một máy khách gửi gói thay vì nhận chúng. Tôi đã đưa ra quyết định một lần để tính toán vật lý ở phía máy khách bởi vì nó giảm tải máy chủ rất nhiều khi có rất nhiều trò chơi đang diễn ra. Có lẽ bạn là đúng và tôi có thể làm tốt hơn các vật lý trong c + + ở phía máy chủ. – automaticoo
Tôi tự hỏi nếu khách hàng có thể gửi dữ liệu trực tiếp cho người khác (và với phát sóng). AIR đã có một số khả năng p2p, không chắc chắn về Flash trong trình duyệt. – alxx