Войти
UnityФорумСеть

c# Socket + Unity

#0
3:42, 30 апр. 2020

Здравствуйте. Интересно написать примитивный сервер для игры на Unity. Язык c#, класс socket, сетевой протокол TCP. Подскажите, как отправить в главный поток движка события из асинхронного сокета? Если не ошибаюсь, в вопросе должны помочь или ключевое слово lock или класс Dispatcher. Готовые решения не интересуют, хочу попробовать сам.


#1
5:30, 30 апр. 2020

Если у вас сокет асинхронный, то в общем-то можно его читать и писать и прямо из главного потока. Когда я пробовал, это отжирало очень мало времени, даже с учетом того что для разбора сообщений использовался десериализатор YAML, а затем адовый рефлекшн для мэппинга YAML на мои DTO-шки.

Если вы всетаки хотите работать с сокетом в другом треде, то можно обмениваться между главным потоком и IO-потоком с помощью двух блокирующих очередей (одну туда и одну сюда). Когда баловался, сделал и так тоже, чтобы сравнить. Привычной мне (по Java) блокирующей очереди в стандартной либе C# я не нашел и использовал вот такой наколеночный вариант:

+ Показать

таймаут при чтении из очереди в главном треде выставляется с учетом времени, которое у нас в этом кадре осталось свободно под ожидание сообщений.

Вообще, на клиенте использовать неблокирующий сокет смысла мало. Если вы только не собираетесь работать с ним прямо в главном треде. Или же встраиваете сервер прямо в игровой клиент. Так то, удобнее 2 треда (туда и сюда) работающийх с блокирующим сокетом.

#2
5:40, 30 апр. 2020

Спасибо. Похоже на правду)

#3
5:52, 30 апр. 2020

а вот сервер лучше делать полностью однопоточным на неблокирующих сокетах. и запускать по процессу на ядро с аффинити.

Недавно смотрел хороший доклад на близкую тему. Рассматривается JVM, а не CLR, но очень многое сходно. Должно быть интересно :)

#4
6:05, 30 апр. 2020

Забавная проблема, конечно) Ищу ответ на этот вопрос уже достаточно долго. Отвечают люди либо с большим опытом, в ответе которых я не могу разобраться, либо люди, которые хотят сумничать)

#5
6:12, 30 апр. 2020

kkolyan
Спасибо, но, честно, хочу обойтись малой кровью, просто фигурки подвигать по сети) я не хочу разбираться в сетевых разработках на других платформах, я хочу пример кода и хочу делать пыщь-пыщь по сети)

#6
13:02, 30 апр. 2020

jkenmor
Вы вроде хотели сами разобраться. А оказывается вам готовые примеры подавай:)
Примеры того, что вы хотите, легко гуглятся. пробуйте, здесь спрашивайте о конкретных проблемах - на хорошие вопросы вам хорошо и ответят.

#7
15:22, 30 апр. 2020


kkolyan
> Примеры того, что вы хотите, легко гуглятся.
Именно то что я описал, я однажды нагуглил, но заставить работать пример у меня не получилось.

kkolyan
> пробуйте, здесь спрашивайте о конкретных проблемах - на хорошие вопросы вам хорошо и ответят.
На мой взгляд достаточно подробно описано. Принта моего говнокода нет, но не думаю, что это тут важно. Это достаточно редкая ерунда, мне кажется. Люди обычно пользуют готовые решения, не морочатся.

#8
13:24, 6 мая 2020

Github https://github.com/vis2k/Telepathy

#9
13:28, 6 мая 2020

Я делал асинк сервер блок для мморпг в профиле последний проект. В потоке чтения складывал в очередь потом в мейновом доставал. Для записи аналогично. Правда были отличия  в сенде через шедулер и напрямую. Принцип шедулера как с чтением. По тайминну все что есть улетает потом снова заполняется очередь. 

UnityФорумСеть

Тема в архиве.