Làm cách nào để giảm thiểu dữ liệu được gửi qua mạng trong FPS hiện đại?


7

Tôi nhận thức được phép nội suy ảnh chụp nhanh với việc sử dụng nén delta là một kỹ thuật được sử dụng để giảm thiểu lượng dữ liệu được gửi trong một trò chơi FPS hiện đại như Quake 3, nhưng còn những kỹ thuật nào khác?


1
Đây là một câu hỏi cực kỳ mơ hồ - cung cấp thêm chi tiết về dữ liệu bạn cần gửi và lý do tại sao bạn cảm thấy nó chưa được tối ưu hóa, sẽ giúp bạn có câu trả lời tốt hơn (hoặc có thể trả lời câu hỏi của bạn cho bạn), nhưng thực tế, câu hỏi này quá mở Cách bạn có thể giảm thiểu dữ liệu tùy thuộc vào dữ liệu mà trò chơi của bạn dựa vào, điều này hoàn toàn được xác định bởi cách bạn thiết kế nó.
Michael Hoffmann

Có vẻ như bạn cần thực hiện một số nghiên cứu cơ bản để có thể đặt câu hỏi cụ thể hơn. Như được viết ngay bây giờ, điều này có khả năng tạo ra danh sách các kỹ thuật và những loại câu hỏi đó có xu hướng bị đóng ngoài chủ đề vì không có cách nào để chọn một câu trả lời đúng. Tôi khuyên bạn nên bắt đầu với các bài viết về Sản phẩm Nội bộ của Jonathan Blow trên mạng, được lưu trữ ở đây đi từ những điều cơ bản đến một số kỹ thuật khá tiên tiến.
DMGregory

Câu trả lời:


6

Khi chúng tôi triển khai công cụ mạng của mình, chúng tôi đã khai thác một số kỹ thuật nén:

  1. Đầu tiên chúng ta viết tất cả các bit snapshot khôn ngoan của mình: bools chỉ có 1 bit thay vì 1 byte (hoặc nhiều hơn tùy thuộc vào trình biên dịch). Chúng tôi đã viết một lớp bitflow đọc và ghi dữ liệu vào một luồng. Điều này giúp tiết kiệm một chút dữ liệu một mình khi đóng gói cờ. Để biết ví dụ về lớp BitStream C ++ đàng hoàng, hãy xem nguồn RakNet gần đây được cung cấp bởi Occulus tại đây: https://github.com/OculusVR/RakNet
  2. Chúng tôi đã tìm thấy cách nhỏ nhất để biểu diễn dữ liệu, theo bitwise - nếu một số nguyên chỉ có thể nằm trong phạm vi từ 0 đến 15, chẳng hạn, chúng tôi chỉ lưu trữ dữ liệu đó trong ảnh chụp nhanh là 4 bit. Chúng tôi thực hiện việc đóng gói phạm vi này trên các số nguyên có chữ ký và không dấu, giảm thiểu lượng dữ liệu được gửi với chi phí phải ghi dữ liệu vào luồng ảnh chụp nhanh của chúng tôi. Có chi phí CPU ở đây, nhưng băng thông dữ liệu giảm đáng kể. Chúng tôi cũng làm điều này cho bảng liệt kê - nếu chỉ có hai trạng thái, chẳng hạn, chỉ mất một bit. Chúng tôi khai thác các mẫu ở đây để làm cho mã này dễ viết.
  3. Chúng tôi thiết lập một số loại dữ liệu có thể được lượng tử hóa - dữ liệu mà chúng tôi hài lòng để mất một số độ chính xác thập phân để giảm băng thông quá dây. Kết hợp với việc đóng gói phạm vi, chúng tôi có thể nén các số dấu phẩy động từ 32 bit xuống mức cụ thể nhỏ hơn, phạm vi và độ chính xác. Một lần nữa chúng tôi khai thác các mẫu ở đây để làm cho mã này dễ viết.
  4. Nén Delta - bạn đã xác định được điều này rồi, nhưng nó tạo ra một tác động đáng kể.
  5. Chúng tôi nhóm các khối dữ liệu trong đó nén delta cho phép chúng tôi nhóm một số trường không thay đổi có liên quan dưới một bit bẩn duy nhất để cho biết liệu chúng có thay đổi hay không. Điều này giúp giảm chi phí gửi một chút cho mỗi trường cho biết nó KHÔNG thay đổi. Có ít hơn một chiến thắng ở đây, và người ta phải cẩn thận về cách bạn nhóm chúng, nhưng các lĩnh vực thường xuyên thay đổi thường thay đổi song song là những ứng cử viên tốt.
  6. Chúng tôi lấy toàn bộ gói và nén nó bằng một công cụ nén nhanh - ví dụ như lz4. Điều này làm giảm dữ liệu nhiều hơn - mọi thứ đều có ích.
  7. Chúng tôi không gửi BẤT K data dữ liệu nào cho các đối tượng ở quá xa để trở thành một phần trong mô phỏng của người chơi cục bộ và đồng bộ hóa hàng loạt các đối tượng đó khi người chơi tiến lại gần. Một số đối tượng được loại trừ khỏi hệ thống này, chẳng hạn như các đối tượng nhiệm vụ, khóa và khóa, chẳng hạn.
  8. Chúng tôi không gửi BẤT K data dữ liệu nào có thể được sao chép một cách đáng tin cậy trên máy khách. Ví dụ: chúng tôi gửi trạng thái và thời gian hoạt hình thay vì vị trí của từng xương - khách hàng có thể đặt ký tự một cách đáng tin cậy vào thông tin đó, tiết kiệm cho chúng tôi băng thông gửi biến đổi của mọi xương (và bất cứ thứ gì được gắn vào các xương đó - hiệu ứng, vv). Chúng tôi mở rộng điều này ra xa nhất có thể. Như một bình luận đã chỉ ra, "nén tốt nhất hoàn toàn không gửi nó".

Tôi chắc chắn có những người khác, nhưng những ý tưởng này sẽ giúp.


1
Vấn đề lớn tôi muốn nói thêm là bạn chỉ nên gửi dữ liệu mà khách hàng không thể tự sao chép một cách đáng tin cậy. Đó là, chỉ gửi những thay đổi trạng thái không phái sinh. Nén dữ liệu mà bạn không cần gửi vẫn tệ hơn là không gửi dữ liệu. :)
Sean Middleditch

@SeanMiddleditch Điểm hay - Tôi sẽ thêm câu đó vào câu trả lời
Steven
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.