- 1,159
- 38
- 544
Доброе утро, народ. Я столкнулся с необычайно интересным, на мой взгляд, поведением...
У меня есть IMessage, который отправляется на сервер и изменяет там инвентарь игрока. Я расчитываю, что информация об измененых слотах придет на клиент во время вызова
Я дебажил код ванильный код кучу раз в поисках ответа на вопрос "как такое возможно"? И у меня складывается впечатление, что пакет читаются в отдельном потоке, а в момент тика обрабатываются те, что "успели накопиться".
Вопрос вот в чем - объясните мне как работает сетевая система в майнкрафте и в особенности - как принимаются мессажжы и почему сервер обрабатывает несколько мессаджей за один тик.
!!ДИСКЛЕЙМЕР!!
Допускаю, что вопрос может оказаться весьма сумбурным, так что любые правки и критика приветствуются. Логи/код пока не вижу смысла выкладывать. Мои знания пока не позволяют мне разобраться в сетевом реализации игры.
У меня есть IMessage, который отправляется на сервер и изменяет там инвентарь игрока. Я расчитываю, что информация об измененых слотах придет на клиент во время вызова
EntityPlayerMP#onUpdate()
при помощи ванильного пакета S2FPacketSetSlot
(см. Container#detectAndSendChanges()
). В целом, я рассчитывал что на каждый мой пакет игра отправит ответ на клиент. Так все и есть, но при попытке протестировать программу на хаотичное поведение (симулировал пользователя-аутиста, тыкая куда только можно), я заметил, что на сервер улетело 2 IMessege
'а. Эти два месседжа внесли изменения в инвентарь, а EntityPlayerMP#onUpdate()
отослал изменения, сделанные только последним пакетом. Достоверно известно из логов, что пакеты НЕ были потеряны и выполнили свою работу. Т.е. мессаджы были обработаны в один тик сервера (т.е. за один вызов networkTick()
).Я дебажил код ванильный код кучу раз в поисках ответа на вопрос "как такое возможно"? И у меня складывается впечатление, что пакет читаются в отдельном потоке, а в момент тика обрабатываются те, что "успели накопиться".
Вопрос вот в чем - объясните мне как работает сетевая система в майнкрафте и в особенности - как принимаются мессажжы и почему сервер обрабатывает несколько мессаджей за один тик.
!!ДИСКЛЕЙМЕР!!
Допускаю, что вопрос может оказаться весьма сумбурным, так что любые правки и критика приветствуются. Логи/код пока не вижу смысла выкладывать. Мои знания пока не позволяют мне разобраться в сетевом реализации игры.