Ні, UDP як і раніше перевершує за затримкою продуктивності та завжди буде швидше, завдяки філософії двох протоколів - якщо припустити, що ваші дані зв'язку були розроблені з використанням UDP або будь-якого іншого збиткового зв'язку.
TCP створює абстракцію, при якій всі мережеві пакети надходять, і вони надходять у тому порядку, в якому вони були надіслані. Для здійснення такої абстракції на каналі, який втрачає втрату, він повинен реалізовувати повторні передачі та тайм-аути, які вимагають часу. Якщо ви надсилаєте 2 оновлення на TCP, і пакет першого оновлення втрачається, другого оновлення ви не побачите, поки:
- Виявлено втрату першого оновлення.
- Потрібна повторна передача першого оновлення.
- повторна передача надійшла та була оброблена.
Не важливо, наскільки швидко це робиться в TCP, адже за допомогою UDP ви просто відкиньте перше оновлення та використовуєте друге, більш нове, прямо зараз. На відміну від TCP, UDP не гарантує, що всі пакети надходять, і не гарантує, що вони надійдуть в порядок.
Це вимагає, щоб ви надсилали потрібний тип даних і проектували ваше спілкування таким чином, щоб втрата даних була прийнятною.
Якщо у вас є дані, куди повинен надходити кожен пакет, і пакети повинні оброблятися вашою грою в тому порядку, в якому вони були надіслані, то UDP не буде швидшим. Насправді використання UDP в цьому випадку, ймовірно, буде повільніше, оскільки ви реконструюєте TCP та реалізуєте його за допомогою UDP, і в цьому випадку ви також можете використовувати TCP.
EDIT - Додавання додаткової інформації для включення / вирішення деяких коментарів:
Зазвичай рівень втрат пакетів на Ethernet дуже низький, але він стає набагато вищим, коли підключений WiFi або якщо користувач здійснює завантаження / завантаження. Припустимо, у нас ідеально рівномірні втрати пакету - 0,01% (в одну сторону, а не в зворотному напрямку). Під час шутера від першої особи клієнти повинні надсилати оновлення щоразу, коли щось відбувається, наприклад, коли курсор миші повертає програвач, що відбувається приблизно 20 разів за секунду. Вони також можуть надсилати оновлення за кадр або через фіксований інтервал, який би становив 60-120 оновлень за секунду. Оскільки ці оновлення надсилаються в різний час, вони / повинні надсилатися в одному пакеті за оновлення. У грі з 16 гравцями всі 16 гравців відправляють ці 20-120 пакетів в секунду на сервер, в результаті чого в цілому виходить 320-1920 пакетів. З нашою швидкістю втрати пакетів 0,01%, ми очікуємо втрати пакету кожні 5,2-31,25 секунди.
На кожен пакет, який ми отримаємо після втраченого пакету, ми надішлемо DupAck, а після 3-го DupAck відправник повторно передасть втрачений пакет . Отже, час, який потрібен TCP для ініціювання повторної передачі, становить 3 пакети, плюс час, необхідний для приходу останнього DupAck до відправника. Тоді нам потрібно дочекатися прибуття повторної передачі, тому загалом чекаємо 3 пакети + 1 затримка в обидва кінці. Затримка в обидва кінці зазвичай становить 0-1 мс в локальній мережі та 50-200 мс в Інтернеті. 3 пакети зазвичай прибувають за 25 мс, якщо ми надсилаємо 120 пакетів в секунду, а за 150 мс - якщо ми надсилаємо 20 пакетів в секунду.
На противагу цьому, з UDP ми відновляємось із втраченого пакету, як тільки отримуємо наступний пакет, тому ми втрачаємо 8,3 мс, якщо надсилаємо 120 пакетів в секунду, і 50 мс, якщо надсилаємо 20 пакетів в секунду.
Завдяки TCP речі отримують більш суттєвий характер, якщо нам також потрібно врахувати Nagle (якщо розробник забуде вимкнути надсилання коалесценції або не може відключити затримку ACK ), уникнення перевантажених мереж або якщо втрата пакету досить погана, що нам доведеться обліковувати кілька втрати пакетів (включаючи втрачені Ack і DupAck). За допомогою UDP ми можемо легко писати швидший код, оскільки нам просто не байдуже бути хорошим громадянином мережі, як це робить TCP.