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

Unity3d. Обработка пакетов, принятых по сети.

#0
10:45, 26 янв. 2020

Всем привет. Решили тут с другом поупражняться в написании сетевого кода. Почитали всякого, написали.
Теперь втаскиваю это в Unity. И вот тут проблема. Кажется, что юнити заточена под работу через сеть со своими классами.(а сейчас они вроде вообще перестраивают эту инфраструктуру).
Как бы то ни было, хочется обойтись без юнитишного сетевого кода, а сделать всё самостоятельно.
Сложность возникла с тем, чтобы получить пакет, а потом обработать его, применив изменения к нужным объектам.
Сейчас делаю так:
1. Запускаю отдельным потоком код, который получает пакеты и складывает их в потокобезопасную очередь.
2. В UI потоке(прям на MonoBehaviour) у меня крутится код, который проверяет, есть ли что-то в очереди. Если что-то нашёл, то вынул из очереди и применил изменения к сцене.

Пока я оставляю за скобками вопрос того, а как я найду на сцене нужный объект, чтобы к нему применить изменения.
Просто хочется понять, какая могла бы тут быть более хорошая реализация получения\применения пакетов(с использованием многопоточности так сказать в стиле Unity3d).
Мне сейчас кажется, что я мог бы как-то ввернуть в эту схему job systems, т.к. джобы тоже про многопоточность, но при этом созданы прям для юнити.

Может кто-то посоветует что-то? Буду рад примером работы с джобами, которые показывают, как:
1. бесконечно наполнять какую-то нибудь очередь одним джобом
2. проверять и опустошать очередь другим джобом.

Или может быть мне тут джобы не помогут вообще?(в большей степени даже хочется получить обоснованный комментарий от знатоков на тему: а помогут ли мне тут джобы как-то?
PS: я не использую ECS. Если перейду на ECS, то может тогда джобы пригодятся? - везде джобы подают в связке с ECS. А у меня шутер от первого лица, поэтому ECS выглядит избыточным.


#1
12:20, 26 янв. 2020

snowslip
> (в большей степени даже хочется получить обоснованный комментарий от знатоков
> на тему: а помогут ли мне тут джобы как-то?
Нет, не помогут. Поможет Subsystem или просто приоритетный монобех-сетевой менеджер. Аргументировать почему они не помогут я не могу, потому что поясни как тебе вообще могут помочь жобы, задача которых распараллеливание вычислений. Иного механизма синхронизации, кроме как подождать окончания выполнения там нет и единственный доступный интерфейс к объектам внутри жоба это TransformAccess.

#2
13:16, 26 янв. 2020

Dampire
> Поможет Subsystem или просто приоритетный монобех-сетевой менеджер.
Про Subsystem почитаю.
А можно подробней про "приоритетный монобех-сетевой менеджер"? Это вы про то, что можно реализовать самому что-то подобное(нет ли у вас примера, если это какой-то устоявшийся паттерн) или это какая-то сетевая инфраструктура, которая есть у юнити?

На самом деле я как раз думал, что может я изобретаю велосипед и где-то есть паттерн для решения моей задачи.

#3
13:34, 26 янв. 2020

snowslip
> "приоритетный монобех-сетевой менеджер"

[DefaultExecutionOrder(-100000)]
public class NetworkManager : MonoBehaviour
{
  public static BlockingCollection<Packet> Incoming = new BlockingCollection<Packet>();

  protected void Update()
  {
    if(Incoming.TryTake(out var packet, 0))
    {
      ...
    }
  }
}
#4
13:52, 26 янв. 2020

А, ну примерно так у меня и сделано сейчас. Только не знал про атрибут DefaultExecutionOrder.

А можно ещё подробней про Subsystem?) Я погуглил, но что-то не нашёл в сети никаких примеров реализации свой кастомной Subsystem. Вижу, что есть всякие юнитишные подсистемы и объяснения, как с ними работать. А как свою запилить и встроить в код - непонятно. Может у вас есть ссылки на годные статьи или небольшой пример на тему того, как к этому подступиться? Хочется этот вариант тоже по-исследовать перед тем, как остановлюсь на чём-то.

#5
14:43, 26 янв. 2020

snowslip
Теоретически создаешь классы от SubsystemDescriptor и Subsystem. Потом SubsystemDescriptor регистрируешь через пакет SubsystemRegistration.CreateDescriptor хоть руками, хоть через RuntimeInitializeOnLoadMethod. На практике ни один из методов Subsystem, в том числе и конструктор вызваны не были, хотя дескриптор регистрировался. Дальше мне стало лень разбираться.

#6
14:48, 26 янв. 2020

Понял, спасибо, буду копать)

UnityФорумСеть

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