No, UDP è ancora superiore in termini di latenza delle prestazioni e sarà sempre più veloce, a causa della filosofia dei 2 protocolli, supponendo che i dati di comunicazione siano stati progettati tenendo conto di UDP o di qualsiasi altra comunicazione con perdita di dati.
TCP crea un'astrazione in cui arrivano tutti i pacchetti di rete e arrivano nell'ordine esatto in cui sono stati inviati. Per implementare tale astrazione su un canale con perdite, è necessario implementare ritrasmissioni e timeout, che richiedono tempo. Se invii 2 aggiornamenti su TCP e un pacchetto del primo aggiornamento viene perso, non vedrai il secondo aggiornamento fino a quando:
- Viene rilevata la perdita del primo aggiornamento.
- È richiesta una ritrasmissione del primo aggiornamento.
- la ritrasmissione è arrivata ed è stata elaborata.
Non importa quanto velocemente ciò avvenga in TCP, perché con UDP scarti semplicemente il primo aggiornamento e usi subito il secondo, il più recente. A differenza di TCP, UDP non garantisce l'arrivo di tutti i pacchetti e non garantisce l'arrivo in ordine.
Ciò richiede di inviare il giusto tipo di dati e di progettare la propria comunicazione in modo tale che la perdita di dati sia accettabile.
Se disponi di dati in cui deve arrivare ogni pacchetto e i pacchetti devono essere elaborati dal tuo gioco nell'ordine in cui sono stati inviati, UDP non sarà più veloce. In effetti, l'utilizzo di UDP in questo caso sarebbe probabilmente più lento perché stai ricostruendo TCP e lo stai implementando tramite UDP, nel qual caso potresti anche usare TCP.
MODIFICA - Aggiunta di alcune informazioni aggiuntive per incorporare / indirizzare alcuni dei commenti:
Normalmente, il tasso di perdita di pacchetti su Ethernet è molto basso, ma diventa molto più alto quando è coinvolto il WiFi o se l'utente ha un upload / download in corso. Supponiamo di avere una perdita di pacchetti perfettamente uniforme dello 0,01% (solo andata, non andata e ritorno). Su uno sparatutto in prima persona, i clienti devono inviare aggiornamenti ogni volta che succede qualcosa, come quando il cursore del mouse gira il giocatore, cosa che accade circa 20 volte al secondo. Potrebbero anche inviare aggiornamenti per frame o ad intervalli fissi, che sarebbero 60-120 aggiornamenti al secondo. Poiché questi aggiornamenti vengono inviati in momenti diversi, verranno / dovrebbero essere inviati in un pacchetto per aggiornamento. In una partita a 16 giocatori, tutti e 16 i giocatori inviano questi 20-120 pacchetti al secondo al server, per un totale di 320-1920 pacchetti al secondo. Con il nostro tasso di perdita di pacchetti dello 0,01%, prevediamo di perdere un pacchetto ogni 5,2-31,25 secondi.
Su ogni pacchetto che riceviamo dopo il pacchetto perso, invieremo un DupAck e dopo il terzo DupAck il mittente ritrasmetterà il pacchetto perso . Quindi il tempo richiesto da TCP per avviare la ritrasmissione è di 3 pacchetti, più il tempo impiegato dall'ultimo DupAck per arrivare al mittente. Quindi dobbiamo attendere l'arrivo della ritrasmissione, quindi in totale aspettiamo 3 pacchetti + 1 latenza andata e ritorno. La latenza di andata e ritorno è in genere 0-1 ms su una rete locale e 50-200 ms su Internet. In genere, 3 pacchetti arriveranno in 25 ms se inviamo 120 pacchetti al secondo e in 150 ms se inviamo 20 pacchetti al secondo.
Al contrario, con UDP ci riprendiamo da un pacchetto perso non appena otteniamo il pacchetto successivo, quindi perdiamo 8,3 ms se inviamo 120 pacchetti al secondo e 50 ms se inviamo 20 pacchetti al secondo.
Con TCP le cose diventano più complicate se dobbiamo anche considerare Nagle (se lo sviluppatore dimentica di disattivare l'invio di coalescenza o non può disabilitare l'ACK ritardato ), l'evitamento della congestione della rete o se la perdita di pacchetti è abbastanza grave che dobbiamo tenere conto di più perdite di pacchetti (inclusi Ack e DupAck persi). Con UDP possiamo facilmente scrivere codice più veloce perché semplicemente non ci interessa essere un buon cittadino di rete come fa TCP.