Как работает сеть в майнкрафте?

Версия Minecraft
1.7.10
1,159
38
544
Доброе утро, народ. Я столкнулся с необычайно интересным, на мой взгляд, поведением...

У меня есть IMessage, который отправляется на сервер и изменяет там инвентарь игрока. Я расчитываю, что информация об измененых слотах придет на клиент во время вызова EntityPlayerMP#onUpdate() при помощи ванильного пакета S2FPacketSetSlot (см. Container#detectAndSendChanges()). В целом, я рассчитывал что на каждый мой пакет игра отправит ответ на клиент. Так все и есть, но при попытке протестировать программу на хаотичное поведение (симулировал пользователя-аутиста, тыкая куда только можно), я заметил, что на сервер улетело 2 IMessege'а. Эти два месседжа внесли изменения в инвентарь, а EntityPlayerMP#onUpdate() отослал изменения, сделанные только последним пакетом. Достоверно известно из логов, что пакеты НЕ были потеряны и выполнили свою работу. Т.е. мессаджы были обработаны в один тик сервера (т.е. за один вызов networkTick()).

Я дебажил код ванильный код кучу раз в поисках ответа на вопрос "как такое возможно"? И у меня складывается впечатление, что пакет читаются в отдельном потоке, а в момент тика обрабатываются те, что "успели накопиться".

Вопрос вот в чем - объясните мне как работает сетевая система в майнкрафте и в особенности - как принимаются мессажжы и почему сервер обрабатывает несколько мессаджей за один тик.

!!ДИСКЛЕЙМЕР!!
Допускаю, что вопрос может оказаться весьма сумбурным, так что любые правки и критика приветствуются. Логи/код пока не вижу смысла выкладывать. Мои знания пока не позволяют мне разобраться в сетевом реализации игры.
 
Решение
у меня складывается впечатление, что пакет читаются в отдельном потоке, а в момент тика обрабатываются те, что "успели накопиться"
Я не очень понимаю, в чем заключается недоумение, потому что понял ты всё правильно.
808
3
124
у меня складывается впечатление, что пакет читаются в отдельном потоке, а в момент тика обрабатываются те, что "успели накопиться"
Я не очень понимаю, в чем заключается недоумение, потому что понял ты всё правильно.
 
1,159
38
544
Я не очень понимаю, в чем заключается недоумение
Я просто хз верно ли у меня представление сети в игре. Продебажил еще раз и действительно, сервер принимает пакеты в потоке под названием "Netty IO #x" и сохраняет их в NetworkManager#receivedPacketsQueue. А обрабатываются пакеты потом в ServerThread.
Клиент же, кажется, принимает пакеты от сервера в потоке "Netty Client IO #x"

потому что понял ты всё правильно
В общем, просто хотел, чтобы кто-то из моддеров проверил так ли я понимаю как сеть работает :)

И еще, зачем нужен NetworkManager и почему их может быть несколько? Откуда они берутся?
 
Сверху