2011-01-17 30 views
5

Tôi đang viết một trò chơi pong trực tuyến đơn giản cho hai người chơi đang chơi trên mạng. Đó là một ứng dụng client-server, với logic trò chơi ở phía máy chủ. Tôi có một số vấn đề với đồng bộ hóa trò chơi ở phía máy khách và kết quả là không hài lòng lắm. Đây là cách hoạt động hiện tại:Đồng bộ hóa mạng trò chơi pong trực tuyến đơn giản

  1. Về phía máy chủ, tôi có một đối tượng trò chơi lưu trữ vị trí của người chơi và bóng, mỗi vật thể có vị trí x, y và x, y. Dựa trên vị trí của các đối tượng được cập nhật trong vòng lặp. Ở phía máy khách, có cùng một đối tượng cục bộ với cùng một dữ liệu và nó cũng được cập nhật trong vòng lặp.
  2. Khi trình phát nhấn/phát hành lên hoặc xuống máy khách gửi gói mạng với một số nguyên, để đối tượng trình phát bắt đầu/dừng để di chuyển trong đối tượng trò chơi trên máy chủ.
  3. Máy chủ gửi gói đồng bộ hóa sau mỗi 50 mili giây với vị trí và vận tốc của cả ba đối tượng. Khi khách hàng nhận được gói này, nó thay đổi vị trí của các đối tượng trò chơi cho phù hợp.

Phương pháp này không hoạt động tốt khi di chuyển đối tượng trò chơi qua lại ở phía máy khách. Bất kỳ ý tưởng làm thế nào để cải thiện nó?

+0

Bạn có ý nghĩa gì với "kết quả không hài lòng" và "di chuyển đối tượng qua lại"? – BlueCookie

+0

Bài viết này xuất hiện sau câu hỏi này: http://drewblaisdell.com/writing/game-networking-techniques-explained-with-pong/ – opyate

Trả lời

17

Thừa nhận bạn có độ trễ 30 m giữa khách hàng và máy chủ. Khách hàng gửi "Tôi muốn di chuyển vợt của tôi xuống" và vợt của nó là tại y = 100px với một vận tốc của 0.1px/ms

30ms giây sau:

  • client vợt là tại y = 100 + 30 * 0,1 = 103px
  • máy chủ nhận được đơn đặt hàng từ khách hàng và bắt đầu di chuyển vợt (mà hiện nay vẫn còn tại y = 100px ở phía máy chủ)

20ms giây sau:

  • client vợt là tại y = 103 + 20 * 0,1 = 105px
  • server-side client vợt là tại y = 100 + 20 * 0,1 = 102px
  • máy chủ gửi cho khách hàng vị trí mới (102px)

30ms giây sau:

  • client rarcket là y = 105 + 30 * 0,1 = 108px
  • khách hàng nhận được từ máy chủ các vị trí phía mới của vợt : 102px

Tại thời điểm này, vợt khách hàng "nhảy" ngược từ 108 đến 102px ...

Làm thế nào để đối phó với những độ trễ mạng? Hai bổ sung cách:

  • chờ đợi máy chủ acknowlegment trước khi thực hiện một hành động
  • dự đoán kết quả của các hành động (trên máy khách và máy chủ bên)

Các aproach đầu tiên được sử dụng khi hiệu lực thi hành khách hàng hầu như không liên kết với kết quả và không thể là "rollback". Ví dụ: khi một khách hàng bắn một tên lửa, nó không thể nhận ra rằng tên lửa này đang bị máy chủ ức chế trong lần cập nhật tiếp theo bởi vì khách hàng thực tế không còn có tên lửa nữa. Vì vậy, trong trường hợp này, ứng dụng của khách hàng sẽ khởi chạy tên lửa chỉ hỗ trợ máy chủ gửi một xác nhận.

Cách thứ hai luôn được sử dụng để tránh những "lần nhảy" này khi đồng bộ hóa máy chủ. Bạn phải theo dõi độ trễ của mạng để dự đoán việc di chuyển các yếu tố trò chơi của mình. Dưới đây là hai cách: tính toán ping hoặc đồng bộ hóa máy chủ và thời gian máy khách khi khởi động (cách dễ nhất và mạnh mẽ hơn). Ý tưởng chung là:

  • client gửi "Tôi muốn di chuyển vợt của tôi xuống lúc = 1.265.871" và bắt đầu di chuyển

30ms sau: vợt

  • khách hàng tại y = 100 + 30 * 0.1 = 103px
  • máy chủ nhận được di chuyển và tính toán độ trễ 30ms (bằng cách ping hoặc thời gian đồng bộ khác biệt) và đặt vị trí vợt tại y = 100 + độ trễ * 0.1 = 100 + 30 * 0.1 = 103px

Hoàn hảo! Chúng được đồng bộ hóa.

20ms sau:

  • server và client vợt ở cả y = 103 + 20 * 0,1 = 105px
  • máy chủ gửi vị trí mới và hướng

30ms sau:

  • vợt của khách hàng tại y = 105 + 30 * 0.1 = 108px
  • khách hàng r eceives vị trí mới VÀ hướng (105px di chuyển xuống), tính toán độ trễ 30ms và đặt vị trí vợt tại y = 105 + độ trễ * 0.1 = 105 * 30 * 0.1 = 108px

Một lần nữa, máy khách và máy chủ được đồng bộ!

Đồng bộ hóa có thể xảy ra trên ứng dụng khách khác khi khách hàng đầu tiên ngừng di chuyển. Trong trường hợp này, vợt máy nghe nhạc sẽ "nhảy" một chút. Khi điều này không quan trọng, có thể làm mịn quá trình chuyển đổi này.

Hy vọng điều đó sẽ hữu ích.

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