ГУИ я взял образно, потому что это понятие в наш разговор ввели вы. Вы правильно говорите, есть данные игра идет, нет данных игра висит. Теперь смотрите: есть данные в буфере сокета - читаем, нет данных или не хватает для полной обработке пакета - завершаемся и ждем следующей итерации, это куда более гуманно к нагрузке на процессор, чем пустые вызовы функции чтения в отдельном потоке. Вы мне пытались доказать, что сеть по-любому нужно выделять в отделять в отдельный поток, а я вас пытаюсь убедить, что в большинстве случаев этого просто не требуется.
Достаточно 30 раз в секунду проверять состояние сетевых буферов, для обеспечения плавной игры. Данного функционала можно добиться при помощи функции FixedUpdate(). Вот и все, проблема решена. Не верите? Попробуйте 30 раз за секунду щелкнуть мышкой. Вот когда научитесь, тогда начнете замечать, что ваша игра работает не плавно
И я даже больше скажу, что достаточно 30 раз в секунду обновлять состояние мира на сервере, что бы все игроки чувствовали плавную игру, а остальное время процессора посвятить чему-нибудь полезному, а не пустому вызову функции, нулевой результат которой вы можете заведомо предсказать.
(Очень распространенное мнение, что чем больше FPS, тем лучше, хотя как показывает практика, что достаточно 60 кадров в секунду, что бы чувствовать себя комфортно, а все что свыше них просто греет вашу видеокарту и выбрасывается во вселенную в тот момент, когда ваши глазные рецепторы "моргнули")
Игра не должна чувствовать сеть вообще
Вот вам ситуация, 2 игрока с помповыми ружьями нацелились в мошонку друг-друга и Игрок 1 нажал спусковой крючок. По вашей логике яйца Игрока 2 покатились по полу, выстукивая по новой испанской плитке мотивы Led Zeppelin.
Но по иронии судьбы пакет Игрока 1 попал на маршрутизатор, который обрабатывал пакет, содержащий сцену "Сиська крупным планом" порно фильма "Белоснежка и Семь принцев 3D", просмотром которого занимался Игрок 978, ожидая своей очереди в игре. И поскольку программное обеспечение для маршрутизатора писали люди, которые любят Белоснежку, а маршрутизатор был очень загружен, то железка выбрала пакет Игрока 978, дабы тот мог спокойно завершить свои физиологические процессы.
В тот же момент, на другом конце страны, Игрок 2 в панике щелкает мышкой, раздается выстрел и вот мы слышим уже знакомый мотив Led Zeppelin (Поскольку серверу пакет Игрока 2 пришел раньше пакета Игрока 1). Представьте удивление Игрока 1, который уже открыл бутылку шампанского, обмывая свою победу, как вдруг на его экране нарисовалась надпись: You Lose!
Вот вам и "игра должна идти дальше, не обращая внимания на сеть". Побойтесь того, что эта недопитая бутылка шампусика может оказаться в заднепроходнем отверстии программиста сети данной игры.
И еще хочу обратить ваше внимание, что происходит при конекте к серверу? зависает поток, в котором происходит этот конект.
Вы напрямую управляете конектом или вызываете функцию и ожидаете ее результата от ОС? Мне кажется второе. Значит есть возможность неблокируемого коннекта? И ведь правда! Дайте задачу своей системе, скормите ей функцию обратного вызова, которая установит флаг "Соединение удалось" и продолжайте заниматься своими делами, проверяя попеременно этот флаг. Уверяю вас, что проверяя его 30 раз в секунду, вы даже не заметите тех 32 мс, которые прошли от момента установки флага до момента следующей его проверки.