Nhiều gói nhỏ là tốt. Trong thực tế, nếu bạn lo lắng về chi phí TCP, chỉ cần chèn một bộ bufferstream
sưu tập lên tới 1500 ký tự (hoặc bất cứ MTU TCP nào của bạn, tốt nhất là yêu cầu nó một cách linh hoạt) và xử lý vấn đề ở một nơi. Làm như vậy sẽ tiết kiệm cho bạn chi phí ~ 40 byte cho mỗi gói bổ sung mà bạn đã tạo.
Điều đó nói rằng, vẫn tốt hơn để gửi ít dữ liệu hơn và xây dựng các đối tượng lớn hơn giúp đỡ ở đó. Tất nhiên là gửi nhỏ "UID:10|1|2|3
hơn gửi UID:10;x:1UID:10;y:2UID:10;z:3
. Trên thực tế, tại thời điểm này, bạn không nên phát minh lại bánh xe, hãy sử dụng một thư viện như protobuf có thể giảm dữ liệu như thế xuống chuỗi 10 byte hoặc ít hơn.
Điều duy nhất bạn không nên quên là chèn một Flush
lệnh trên luồng của mình tại các vị trí có liên quan, bởi vì ngay khi bạn ngừng thêm dữ liệu vào luồng của mình, nó có thể đợi vô hạn trước khi nó gửi bất cứ thứ gì. Thực sự có vấn đề khi khách hàng của bạn đang chờ dữ liệu đó và máy chủ của bạn sẽ không gửi bất cứ điều gì mới cho đến khi khách hàng gửi lệnh tiếp theo.
Mất gói là một cái gì đó bạn có thể ảnh hưởng ở đây, lề. Mỗi byte bạn gửi có khả năng bị hỏng và TCP sẽ tự động yêu cầu truyền lại. Các gói nhỏ hơn có nghĩa là cơ hội thấp hơn cho mỗi gói bị hỏng, nhưng vì chúng cộng vào chi phí, bạn gửi nhiều byte hơn, làm tăng tỷ lệ của gói bị mất nhiều hơn. Khi một gói bị mất, TCP sẽ đệm tất cả dữ liệu thành công cho đến khi gói bị thiếu được gửi lại và nhận được. Điều này dẫn đến một độ trễ lớn (ping). Mặc dù tổng tổn thất về băng thông do mất gói có thể không đáng kể, ping cao hơn sẽ là điều không mong muốn đối với các trò chơi.
Điểm mấu chốt: Gửi càng ít dữ liệu càng tốt, gửi các gói lớn và không viết các phương thức cấp thấp của riêng bạn để làm như vậy, mà dựa vào các thư viện và phương thức nổi tiếng như bufferstream
và protobuf để xử lý việc nâng vật nặng.