Beaucoup de petits paquets sont très bien. En fait, si vous êtes préoccupé par la surcharge TCP, insérez simplement un bufferstream
qui collecte jusqu'à 1500 caractères (ou quel que soit votre MTU TCP, il est préférable de le demander dynamiquement), et traitez le problème en un seul endroit. Cela vous épargne la surcharge de ~ 40 octets pour chaque paquet supplémentaire que vous auriez autrement créé.
Cela dit, il est toujours préférable d'envoyer moins de données, et la construction d'objets plus gros y contribue. Bien sûr, il est plus petit d'envoyer "UID:10|1|2|3
que d'envoyer UID:10;x:1UID:10;y:2UID:10;z:3
. En fait, à ce stade, vous ne devriez pas non plus réinventer la roue, utilisez une bibliothèque comme protobuf qui peut réduire des données comme celle-ci à une chaîne de 10 octets ou moins.
La seule chose que vous ne devez pas oublier est d'insérer un Flush
commande sur votre flux aux emplacements appropriés, car dès que vous arrêtez d'ajouter des données à votre flux, il peut attendre infini avant d'envoyer quoi que ce soit. Vraiment problématique lorsque votre client attend ces données, et votre serveur n'enverra rien de nouveau jusqu'à ce que le client envoie la commande suivante.
La perte de colis est quelque chose que vous pouvez affecter ici, de manière marginale. Chaque octet que vous envoyez peut être potentiellement corrompu, et TCP demandera automatiquement une retransmission. Des packages plus petits signifient une chance moindre pour chaque package d'être corrompu, mais parce qu'ils s'additionnent sur la surcharge, vous envoyez encore plus d'octets, augmentant encore plus les chances d'un package perdu. Lorsqu'un package est perdu, TCP mettra en mémoire tampon toutes les données suivantes jusqu'à ce que le package manquant soit renvoyé et reçu. Cela entraîne un retard important (ping). Bien que la perte totale de bande passante en raison de la perte de package puisse être négligeable, le ping plus élevé ne serait pas souhaitable pour les jeux.
Conclusion: envoyez aussi peu de données que possible, envoyez de gros paquets et n'écrivez pas vos propres méthodes de bas niveau pour le faire, mais comptez sur des bibliothèques et des méthodes bien connues comme bufferstream
et protobuf pour gérer le gros du travail.