Ловушки сетевого кода: сообщения, которые тихо исчезают
Ошибки в многопользовательских играх — особый вид: ничего не падает, в журнале нет ни одной ошибки — просто ничего не происходит. Две наши любимые ловушки из собственного сетевого кода — в качестве предупреждения и для развлечения.
Ловушка 1: незарегистрированное сообщение. Наш сетевой протокол знает классы сообщений — «блок изменился», «игрок переместился», «чат». Каждый новый тип сообщения нужно зарегистрировать в кодеке, чтобы он получил ID и его можно было сериализовать. Забудешь — случится худшее: вызов отправки не срабатывает, но ошибка тихо проглатывается. Ни падения, ни записи в журнале — функция «просто не работает». Мы отлаживали это не раз, пока не выработался рефлекс: новый класс сообщения? Первый вопрос: он зарегистрирован?
Ловушка 2: блок-призрак. Когда сервер меняет блок — например, потому что скрипт перестраивает рельеф, — он должен активно сообщить об этом всем подключённым игрокам. Забудешь разослать — получишь блок-призрак: сервер знает, что там есть блок, а клиент показывает воздух. Игрок упирается в невидимую стену — или, что хуже, строит там, где на сервере уже ничего нет. Только перезагрузка чанка снова согласует оба мира.
Общий знаменатель: в мультиплеере всегда две правды — серверная и клиентская, и каждое место, где их нужно синхронизировать, — потенциальная ловушка. Наш ответ — тесты, проверяющие именно эту синхронизацию, и чек-листы для новых сообщений. Ничего эффектного, но призраков с тех пор стало мало.
Комментарии