В нашей игре есть знаменитая «застрявшая ошибка», которая представляет собой особую ситуацию, когда игроки больше не могут двигаться.Фактически, клиенты больше не будут получать пакеты с сервера, пока сервер все еще отправляет их, а также получает новые пакеты от клиентов.Этой ошибке не менее 1 года, и она до сих пор не решена, поэтому я подумал о том, чтобы спросить.
Некоторые факты:
Когда ошибка возникает, она случается со всемиподключенные клиенты одновременно.
Новые клиенты могут подключаться и продолжать играть без проблем.
Удаление сообщений всегда выполняется сервером -> клиенты, никогда наоборот.
Соединения все еще активны и правильно закрываются RakNet, когда клиент нормально отключается (закрывает игру).
При возникновении ошибки клиент не получит событие «потерянное соединение» от RakNet.Когда сервер закрывается, он получит его через 10 секунд.Я предполагаю, что он все еще как-то получает внутренние пакеты.
Не имеет значения, на какой клиент (ы) сервер отправляет «плохой» пакет / событие, ошибка всегда будет возникать
RakNet 3.705, статически связанный.
Отправка с RELIABLE_ORDERED на канал 0, в обе стороны.
C ++
VS2010
Интересно то, что в некоторых случаях мы можем воспроизвести проблему, но случаи кажутся случайными.Похоже, это происходит при отправке события (JSON) с сервера клиентам, которое затем никогда не приходит, а затем оно прерывается.Случайным моментом является то, что я могу немного изменить содержимое строки внутри события, и это заставит проблему появиться или исчезнуть.
Я не могу представить, что это ошибка в RakNet.Может ли это быть какой-то формой повреждения кучи?
Для борьбы с повреждением кучи мы используем:
- виртуальные GetAs () * функции приведения, которые возвращают this.
- Диспетчер памяти с отслеживанием памяти, типичными утверждениями и защитниками.
- Почти всегда используется проверка границ "fxArrays" вместо собственных массивов C.
Я все еще что-то здесь упускаю?
Спасибо за помощь !!
Antoon