Tôi có thể đi vào rất nhiều chi tiết về điều này nhưng trước tiên, hãy đọc "1500 cung thủ" http://www.gamasutra.com/view/feature/3094/1500_archers_on_a_288_network_.php và điều này sẽ trả lời nhiều câu hỏi của bạn. Dưới đây là tóm tắt: Đầu tiên, hầu hết các trò chơi đều sử dụng UDP do tính chất thời gian thực của trò chơi. Các trò chơi vòng trông giống như sau:
- dữ liệu mạng đọc
- làm dự đoán client-side và so sánh với nơi mạng nói đối tượng của bạn thực sự cần được
- mớ hỗn độn với vật lý lận gì mạng nói với những gì trạng thái trò chơi địa phương của bạn là
- gửi dữ liệu trở lại ra ngoài mạng dựa trên những gì bạn đã làm khung này (nếu bất cứ điều gì)
- làm
Rất đơn giản và "lộn xộn với vật lý" có thể dễ dàng là một cuốn sách 200 trang nhưng nó liên quan đến việc dự đoán phía máy khách, nơi có khả năng, nhận dữ liệu từ máy chủ cũ nhưng một đối tượng là/nên, và sau đó nội suy các giá trị bằng cách nào đó để làm cho đối tượng xuất hiện "đủ gần" đến nơi nó thực sự được cho là không ai nhận thấy. Đây là siêu quan trọng trong game bắn súng người đầu tiên nhưng không nhiều cho chiến lược thời gian thực.
Đối với chiến lược thời gian thực, điều thường xảy ra là hệ thống theo lượt, thời gian được chia thành các khối kín đáo được gọi là "lượt" xảy ra tuần tự và mỗi lượt có một số được tạo bởi hàm đơn điệu đảm bảo giá trị ngày càng tăng một thứ tự cụ thể không trùng lặp. Trên mỗi n lần lượt, mỗi máy khách gửi một thông điệp đến tất cả các máy khách khác với hành động dự định của chúng trên n + m, trong đó m là một số tùy ý thường nhỏ và có thể xác định tốt nhất thông qua thử và sai cũng như playtesting. Khi tất cả các khách hàng đã gửi hành động dự định của họ, mỗi khách hàng thực hiện tất cả các hành động được gửi lần lượt trên n + m. Điều này giới thiệu một sự chậm trễ nhỏ trong khi một hành động được đặt hàng bởi người dùng và khi nó thực hiện, tuy nhiên điều này thường không đáng chú ý.
Có một số kỹ thuật có thể được sử dụng để làm mờ thời gian. Ví dụ, nếu bạn highlite một đơn vị và sau đó nói với nó để di chuyển, nó sẽ tạo ra một âm thanh và có một hình ảnh động khi nó bắt đầu di chuyển nhưng sẽ không thực sự di chuyển ngay lập tức.Tuy nhiên, thông báo mạng của ý định di chuyển đơn vị đó sẽ được gửi ngay lập tức, do đó, khi màn hình phản hồi đầu vào của người chơi, các tin nhắn mạng đã được gửi và xác nhận. Bạn có thể fudge nó hơn nữa bằng cách giới thiệu một sự chậm trễ nhỏ (100ms hoặc hơn) giữa nhấp chuột và phản ứng của đối tượng trò chơi. Điều này thường không đáng chú ý bởi người chơi nhưng 100ms là một cõi đời đời trong trò chơi LAN và thậm chí với kết nối băng thông rộng trên máy tính gia đình, ping trung bình có thể khoảng 15-60ms hoặc lâu hơn, điều này mang lại cho bạn nhiều thời gian để gửi gói trước sự di chuyển.
Đối với dữ liệu cần gửi, có hai loại dữ liệu trong trò chơi: xác định và không xác định. hành động xác định được căn cứ trong vật lý trò chơi để khi hành động bắt đầu, có một đảm bảo 100% rằng tôi có thể dự đoán kết quả của hành động đó. Dữ liệu này không bao giờ cần phải được gửi qua mạng kể từ khi tôi có thể xác định những gì nó sẽ được trên máy khách dựa trên trạng thái ban đầu. Lưu ý rằng việc sử dụng trình tạo số ngẫu nhiên với cùng một hạt giống trên mỗi máy khách sẽ chuyển các sự kiện "ngẫu nhiên" thành hành vi xác định. Dữ liệu không xác định thường là đầu vào của người dùng nhưng có thể dự đoán đầu vào của người dùng có khả năng là gì trong nhiều trường hợp. Cách mà cặp đôi này trong trò chơi chiến lược thời gian thực là sự kiện không xác định là một số thứ tự sắp xếp cho một trong các đối tượng trò chơi của tôi. Khi đối tượng trò chơi đã được ra lệnh di chuyển, cách thức di chuyển của nó là 100% xác định. Do đó, tất cả những gì bạn cần gửi trên mạng là ID của đối tượng, lệnh được đưa ra (làm cho điều này là enum để tiết kiệm băng thông), và đích của lệnh (nếu có, vì vậy một phép thuật có thể không có đích nếu nó là một khu vực của affet nhưng một lệnh di chuyển có một điểm đến cuối cùng). Nếu người dùng nhấp chuột như 100 lần để thực hiện di chuyển đơn vị, không cần phải gửi lệnh di chuyển riêng cho mỗi lần nhấp vì tất cả chúng đều nằm trong cùng một khu vực chung, vì vậy hãy chắc chắn lọc bộ lọc này vì nó sẽ giết băng thông.
Một mẹo cuối cùng để xử lý sự chậm trễ có thể giữa lệnh và thực thi của nó là một cái gì đó gọi là bộ lọc nhận thức cục bộ. Nếu tôi nhận được lệnh di chuyển một thời gian sau khi lệnh được đưa ra, tôi biết khi nào đơn vị nên bắt đầu di chuyển và tôi biết điểm đến cuối cùng của nó. Thay vì dịch chuyển đơn vị để có được nó, tôi có thể bắt đầu chuyển động muộn và sau đó lộn xộn với vật lý để tăng tốc nó lên một chút để nó có thể bắt kịp nơi nó được cho là, và sau đó làm chậm nó xuống đặt nó vào đúng chỗ. Giá trị chính xác bạn cần để tăng tốc nó cũng là tương đối và playtesting là cách duy nhất để xác định giá trị chính xác bởi vì nó chỉ có "cảm thấy đúng" để cho nó được chính xác. Bạn có thể làm điều tương tự với bắn đạn và tên lửa là tốt và nó rất hiệu quả cho điều đó. Lý do này hoạt động là con người không phải là khủng khiếp khi nhìn thấy những thay đổi tinh tế trong chuyển động, đặc biệt nếu một vật thể hướng trực tiếp tới họ hoặc tránh xa chúng, vì vậy chúng không nhận ra.
Điều tiếp theo cần suy nghĩ là giảm băng thông. Không gửi tin nhắn cho khách hàng mà không thể nhìn thấy hoặc tương tác với một đơn vị đang di chuyển. Không gửi đi lặp lại cùng một tin nhắn vì người dùng nhấp chuột. Không gửi tin nhắn ngay lập tức cho các sự kiện không ảnh hưởng ngay lập tức. Cuối cùng, không yêu cầu một sự thừa nhận cho các sự kiện sẽ cũ nếu họ không nhận được. Nếu tôi không nhận được bản cập nhật chuyển động, khi tôi truyền lại bản cập nhật đó, giá trị của nó sẽ quá cũ nên không còn phù hợp nữa nên tốt hơn là chỉ cần gửi một thao tác khác và sử dụng bộ lọc nhận thức cục bộ để bắt kịp hoặc sử dụng một spline khối để nội suy các phong trào để nó trông chính xác hơn hoặc một cái gì đó của bản chất đó. Tuy nhiên, một sự kiện quan trọng, chẳng hạn như "bạn đã chết" hoặc "cờ của bạn đã được thực hiện" phải được thừa nhận và truyền lại nếu cần. Tôi dạy lập trình trò chơi mạng tại Digipen vì vậy hãy hỏi bất kỳ câu hỏi nào khác về điều này vì tôi có thể cung cấp cho bạn câu trả lời. Lập trình trò chơi trên mạng có thể khá phức tạp nhưng cuối cùng là tất cả về việc đưa ra lựa chọn trong việc triển khai và hiểu được hậu quả của sự lựa chọn của bạn.
+1 damn thú vị đọc, ngay cả với một game thủ không giống như bản thân mình. – JonnyD