Багато невеликих пакетів добре. Насправді, якщо ви турбуєтесь про накладні витрати TCP, просто вставітьbufferstream
який збирає до 1500 символів (або як би там не було ваших MTU MTP, краще запитати це динамічно), і вирішуйте проблему в одному місці. Таким чином ви заощаджуєте накладні витрати в розмірі ~ 40 байт за кожен додатковий пакет, який ви інакше створили б.
Однак, все ж краще надсилати менше даних, і там створюють більші об'єкти. Звичайно, надіслати менше, "UID:10|1|2|3
ніж надіслати UID:10;x:1UID:10;y:2UID:10;z:3
. Насправді, також на цьому етапі ви не повинні винаходити колесо, використовуйте бібліотеку на зразок протобуфа, яка може зменшити такі дані до рядка 10 байт або менше.
Єдине, про що ви не повинні забувати - це вставити Flush
команди у свій потік у відповідних місцях, тому що як тільки ви припините додавати дані у свій потік, він може нескінченно чекати, перш ніж він щось надсилатиме. Дійсно проблематично, коли ваш клієнт чекає цих даних, і ваш сервер не буде надсилати нічого нового, поки клієнт не відправить наступну команду.
Втрата пакунків - це те, на що ви можете вплинути тут незначно. Кожен відправлений байт потенційно може бути пошкоджений, і TCP автоматично подасть запит на повторну передачу. Менші пакети означають менший шанс пошкодження кожного пакету, але оскільки вони складаються накладні витрати, ви надсилаєте ще більше байтів, збільшуючи шанси втраченого пакету ще більше. Коли пакет втрачено, TCP буде буферувати всі наступні дані, поки відсутній пакет не буде повторно відправлений та отриманий. Це призводить до великої затримки (пінг). Хоча загальна втрата пропускної здатності через втрату пакету може бути незначною, то вищий пінг буде небажаним для ігор.
Підсумок: надсилайте якомога менше даних, надсилайте великі пакунки та не пишіть власні методи низького рівня для цього, але покладайтеся на добре відомі бібліотеки та методи, як-от bufferstream
і протобуф для обробки важкого підйому.