Основи онлайн-ігри для багатокористувацьких ігор [закрито]


9

Зараз я працюю над багатокористувацькою грою в режимі реального часу онлайн. Метою є встановлення підключення на основі клієнта / сервера за допомогою протоколу UDP. Поки я використовував UDP для руху гравців і TCP для подій (стрілянина гравця, гравець, який втрачає життя), тому що мені потрібно бути впевненим, що такі дані надійдуть до всіх гравців, підключених до сервера. Я знаю, що UDP вважають "ненадійним", і деякі пакети можуть бути втрачені. Але я читав всюди, щоб ніколи не змішувати TCP і UDP, оскільки це може вплинути на з'єднання.

Головне питання - як я повинен організувати свою мережу?

UDP не пов'язаний, як я можу врятувати, хто є хто? Чи потрібно зберігати ip адреси клієнтів у списку?

Чи варто використовувати TCP для важливих подій або використовувати UDP? Якщо мені потрібно використовувати UDP, як я можу переконатися, що дані не будуть втрачені?

Використовуючи і TCP, і UDP, мені потрібно зберегти для кожного гравця свою IP-адресу в списку (для UDP) та TcpClient, який з'єднаний в іншому списку (для UDP). Як я можу змінити це на більш ефективне?


@JoshPetrie це запитання є законним "Головне питання - як мені організувати свою мережу?". Справа не в тому, чи слід використовувати те чи інше. ОП використовує одне і потребує порад щодо додавання ще однієї технології, яку він вже обрав. Це широке значення, оскільки відповідь не вказує на те, яку технологію слід використовувати, але в тому, як програмне забезпечення можна структурувати, щоб уникнути роздуття труб, зменшити відставання та підвищити надійність незалежно від основної технології.
Койот

Він також занадто широкий. Питання слід відредагувати (не соромтеся це робити, воно досить старе), щоб бути більш тематичним, тоді його можна буде знову відкрити.

Відповіді:


6

UDP має менші накладні витрати, але ціною втрати пакетів, не знаючи про це (частина накладних витрат із TCP забезпечує повторне надсилання втрачених пакетів).

Однак велика проблема використання UDP полягає в тому, що існує багато сайтів, які блокують увесь трафік UDP (крім DNS), оскільки багато адміністраторів вважають, що це хороша практика безпеки.

Крім того, не припускайте, що кожен з ваших гравців матиме різну IP-адресу - є багато ситуацій, коли декілька користувачів поділяють одне і те ж підключення до Інтернету, і якщо школярі зачепляться за вашу гру, ви можете зробити ставку, що вони, мабуть, Ви збираєтесь з'ясувати, як встановити та запустити його під час уроку, а не робити свою роботу (а чи не хочете ви, щоб вони витрачали цей дорогоцінний час на вашу гру замість чужого?).

Щойно ваш потік TCP відкритий, він все ще досить ефективний. Наступним кроком є ​​мінімізація кількості даних, які ви надсилаєте / отримуєте, і саме тут починає діяти протокол. Якщо ви просто надішлите кілька байтів для кожної команди (наприклад, "рухайтесь вперед") замість, наприклад, загортання тієї ж команди в сотні байтів XML-коду, то загальне споживання пропускної здатності мережі буде нижчим, і менше циклів процесора буде менше потрібно обробляти інформацію (кілька байтів легко порівнюються проти демонтажу та інтерпретації та перевірки синтаксису великим фрагментом XML).

Ви, звичайно, можете відкривати кілька потоків TCP і використовувати їх для різних цілей, наприклад, одного для команд, іншого для передачі графіки, іншого для чату на основі аудіо тощо. Таким чином, якщо ви переносите велику графіку, яка займає 5-10 секунд для завантаження, принаймні рухи команд програвача не будуть відставати, оскільки вони будуть в іншому потоці (і ви можете відображати спрайт за замовчуванням, поки новий спрайт не закінчиться завантаженням, що завжди веселіше, ніж очікування).


1
Оригінальне запитання згадувало модель клієнт-сервер, тому "сайти", що блокують всі UDP, не мають значення; це проблема клієнта, і я сумніваюся, що багато клієнтів насправді блокують всі UDP. "Використання TCP - це найгірша можлива помилка, яку ви можете зробити при розробці мережевої гри! Щоб зрозуміти чому, вам потрібно подивитися, що насправді робить TCP над IP, щоб все виглядало так просто!" Дивіться gafferongames.com/networking-for-game-programmers/udp-vs-tcp
дійсно005

@ zaista005: Є в цьому плюси і мінуси - UDP, безумовно, забезпечує перевагу в продуктивності, але ціною надійності (саме тут має перевагу TCP). Що стосується блокування UDP, то ви абсолютно праві, що це проблема клієнта, але в багатьох корпоративних та освітніх середовищах я стикався з тим, що UDP (за винятком порту 53) блокується нерозумними адміністраторами, які вважають, що UDP є проблемою безпеки, і тож варіант для клієнта, що повертається до TCP, може принаймні означати, що гравець може випробувати гру (особливо якщо пропускна здатність мережі досить швидка).
Рандольф Річардсон

@ zaista005: Також використання суміші UDP і TCP може бути цілком прийнятним, оскільки TCP може використовуватися для передачі даних з нижчим пріоритетом, тоді як UDP може використовуватися для швидкої дії. Цікаво також зазначити, що з IPv6 доступні нові варіанти (недоступні для IPv4), які можуть задовольнити потреби в іграх у режимі реального часу, не будучи безмежними за своєю природою, але я думаю, що до IPv6 пройде деякий час. ми можемо використовувати ігри, також не покладаючись на IPv4 (це прикро, тому ми робимо IPv4 якнайкраще, наскільки це можливо).
Рандольф Річардсон

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.