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:
- Đầ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
- 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.
- 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.
- 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ể.
- 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.
- 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.
- 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.
- 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.