Wiele małych paczek jest w porządku. W rzeczywistości, jeśli martwisz się o obciążenie TCP, po prostu wstawbufferstream
zbierający do 1500 znaków (lub cokolwiek to jest Twój MTU, najlepiej żądać go dynamicznie) i rozwiąż problem w jednym miejscu. Pozwala to zaoszczędzić około 40 bajtów na każdym dodatkowym pakiecie, który w innym przypadku zostałby utworzony.
To powiedziawszy, nadal lepiej jest wysyłać mniej danych, a budowanie większych obiektów pomaga w tym. Oczywiście wysyłanie jest mniejsze "UID:10|1|2|3
niż wysyłanie UID:10;x:1UID:10;y:2UID:10;z:3
. W rzeczywistości również w tym momencie nie powinieneś wymyślać koła na nowo, użyj biblioteki takiej jak protobuf, która może zmniejszyć takie dane do ciągu 10 bajtów lub mniej.
Jedyną rzeczą, o której nie należy zapominać, jest wstawienie Flush
poleceń do strumienia w odpowiednich lokalizacjach, ponieważ gdy tylko przestaniesz dodawać dane do strumienia, może czekać nieskończenie długo, zanim cokolwiek wyśle. Naprawdę problematyczne, gdy klient czeka na te dane, a serwer nie wysyła niczego nowego, dopóki klient nie wyśle następnej komendy.
Utrata paczki może mieć tutaj niewielki wpływ. Każdy wysłany bajt może być potencjalnie uszkodzony, a TCP automatycznie zażąda retransmisji. Mniejsze paczki oznaczają mniejszą szansę na uszkodzenie każdego pakietu, ale ponieważ sumują się one narzut, wysyłasz jeszcze więcej bajtów, jeszcze bardziej zwiększając szanse na zgubienie paczki. Gdy pakiet zostanie utracony, TCP buforuje wszystkie kolejne dane, dopóki brakujący pakiet nie zostanie ponownie wysłany i odebrany. Powoduje to duże opóźnienie (ping). Podczas gdy całkowita utrata przepustowości z powodu utraty pakietu może być nieznaczna, wyższy ping byłby niepożądany w grach.
Konkluzja: Wysyłaj tak mało danych, jak to możliwe, wysyłaj duże paczki i nie pisz własnych metod niskiego poziomu, aby to zrobić, ale polegaj na dobrze znanych bibliotekach i metodach takich jak bufferstream
i protobuf, aby poradzić sobie z ciężkim podnoszeniem.