Пастки мережевого коду: повідомлення, що зникають безслідно
Помилки в мультиплеєрі — окремий рід: нічого не падає, жодної помилки в журналі — просто нічого не відбувається. Дві наші улюблені пастки з власного мережевого коду — як застереження і для розваги.
Пастка 1: незареєстроване повідомлення. Наш мережевий протокол знає класи повідомлень — «блок змінено», «гравець перемістився», «чат». Кожен новий тип повідомлення треба зареєструвати в кодеку, щоб він отримав ідентифікатор і міг серіалізуватися. Забудьте про це — і станеться найгірше: виклик відправлення завершується невдачею, але в місці, де помилку тихо ковтають. Ні збою, ні запису в журналі — функція «просто не працює». Ми налагоджували це не раз, поки не виробився рефлекс: новий клас повідомлення? Перше питання: чи його зареєстровано?
Пастка 2: блок-привид. Коли сервер змінює блок — скажімо, тому що скрипт перетворює ландшафт, — він має активно повідомити про це всіх підключених гравців. Забудьте про розсилку — і матимете блок-привид: сервер знає, що там є блок, а клієнт показує повітря. Гравець наштовхується на невидиму стіну — або, що гірше, будує там, де на боці сервера вже нічого немає. Лише перезавантаження чанка знову узгоджує обидва світи.
Спільний знаменник: у мультиплеєрі завжди є дві правди — серверна і клієнтська, і кожне місце, де їх треба синхронізувати, — потенційна пастка. Наша відповідь — тести, що перевіряють саме цю синхронізацію, і контрольні списки для нових повідомлень. Непомітно, але відтоді привидів поменшало.
Коментарі