Я тоже :) Только они кроме вот такой экономии трех бит в одном месте шлют кучу "лишних" данных. Я пока глубоко не ковырял чат, но каждое сообщение - это 300-500 байт сверх самого текста =/
Плюс полная инфа о инвентаре и надетых вещах пересылается каждые несколько минут. Небось легаси с тех времен, когда клиент отвечал за расчет урона и прочего, и надо было все синхронизировать чтобы читерам было тяжелее (ха), но тоже добавляет десятки-сотни килобайт в час.
Ну и win1251 для логинов, паролей и имен персонажей, когда допустимых символов даже на 7 бит не набирается.
Мне кажется, они очень (слишком?) активно пытались оптимизировать траффик под модемы. Например, поле со статами может быть 1 бит, а может - 32. Зависит это от чиселки, которую надо туда записать, т.е. 0 займет всего 1 бит.
Ну и, как обычно, писали код на коленке разные люди и между собой особо не общались. Мне сложно представить другое адекватное объяснение, зачем нужно было придумывать 3 разных способа передачи координат -- до сих пор от этого больно.
Собирался дописать эмулятор и донейтнуть его в какой-нибудь game preservation музей. Ближе к делу попробую разобраться, насколько легально поднимать сервер. Если не получу cease&desist раньше, конечно
Имхо, у Сферы были крутой узнаваемый стиль и интересная механика. А возможность в ММО складывать объекты друг на друга и строить лестницы из персонажей, чтобы куда-нибудь залезть, до сих пор иногда взрывает мне мозг :)
Всегда рад :) У меня Сфера вызывает смешанные чувства - она абсолютно сломанная (и не то чтобы идеально продуманная даже без этого), но все равно нравится. Даже не помню, когда в последний раз в нее играл по-нормальному
У меня нет нормального ответа, на самом деле. Я сначала написал почти весь существующий код, пока разбирался, как оно работает, а потом уже подумал, где есть бесплатный navmesh)
Вся физика на сервере, т.е. клиенту отдается текущее положение объекта в пространстве, без скорости / приложенных сил и т.д. Дальше клиент как-то интерполирует перемещение из точки А в точку Б.
А вот как это самое положение в пространстве лежит в пакете - это прекрасно:
Его минимум 3 варианта в зависимости от отправителя и действия:
Сервер, перемещение объектов
Сервер, все остальное (спавн игрока и предметов, телепорт игрока и т.д.)
Клиент, пинг
Для перемещения объектов сервер кладет в пакет:
32768 + целую часть значения, если это X или Z
1200 + целую часть значения, если это Y
Дробную часть каждой координаты (точнее, 4095 - значение для X и Z и 1200 - значение для Y) в другом месте, с точностью примерно до 1/64 этой дробной части. Возможно, тут есть какая-то сильно более простая формула, но я ее пока не понял.
Для всего остального на сервере:
Берем целую часть двоичного логарифма координаты, она же Math.Truncate(log2(x)) (если координата в полуинтервале [0; 1), результат всех операций 58)
Берем кол-во шагов, которое нужно пройти, чтобы от 11 (т.е. базовой координаты 2048) дойти до 2ˆMath.Truncate(log2(x))
Если координата больше 2048, то масштаб (или как его назвать еще) = 69 + steps / 2
Если координата меньше или равна 2048, то масштаб = 69 - (steps + 1) / 2
Число, которое мы будем энкодить = (x / 2ˆ(Math.Truncate(log2(x))) + 1) * 2 ^ 23. Дробную часть отбрасываем.
Дальше нам остается только записать эту чиселку и масштаб, не забыв поменять один из бит на 1, если кол-во шагов из пункта 2 нечетное.
На клиенте похожая история, только масштаб там начинается с 126.
Я надеюсь, что есть какой-то адекватный алгоритм, делающий эти преобразования проще, но я не очень умный и его не знаю
Насчет помочь - я всеми руками за, пожалуйста, пишите мне :)
Координаты перемещения я проверял в стартовом данже, он под землей. Вполне вероятно, что на поверхности или в других диапазонах координат формула окажется другой =/
Суммарно координаты заняли у меня где-то с месяц по несколько часов в день, наверно.
Я тоже :) Только они кроме вот такой экономии трех бит в одном месте шлют кучу "лишних" данных. Я пока глубоко не ковырял чат, но каждое сообщение - это 300-500 байт сверх самого текста =/
Плюс полная инфа о инвентаре и надетых вещах пересылается каждые несколько минут. Небось легаси с тех времен, когда клиент отвечал за расчет урона и прочего, и надо было все синхронизировать чтобы читерам было тяжелее (ха), но тоже добавляет десятки-сотни килобайт в час.
Ну и win1251 для логинов, паролей и имен персонажей, когда допустимых символов даже на 7 бит не набирается.
Мне кажется, они очень (слишком?) активно пытались оптимизировать траффик под модемы. Например, поле со статами может быть 1 бит, а может - 32. Зависит это от чиселки, которую надо туда записать, т.е. 0 займет всего 1 бит.
Ну и, как обычно, писали код на коленке разные люди и между собой особо не общались. Мне сложно представить другое адекватное объяснение, зачем нужно было придумывать 3 разных способа передачи координат -- до сих пор от этого больно.
Пару месяцев почти ничего по нему не делал, умудрился заболеть ковидом ровно в тот день, когда WHO объявила, что пандемия побеждена :)
Все может быть :)
Круто, спасибо! Я как раз искал что-нибудь удобное и визуально понятное
Я не буду отвечать на этот вопрос без адвоката :)
Собирался дописать эмулятор и донейтнуть его в какой-нибудь game preservation музей. Ближе к делу попробую разобраться, насколько легально поднимать сервер. Если не получу cease&desist раньше, конечно
Имхо, у Сферы были крутой узнаваемый стиль и интересная механика. А возможность в ММО складывать объекты друг на друга и строить лестницы из персонажей, чтобы куда-нибудь залезть, до сих пор иногда взрывает мне мозг :)
Всегда рад :) У меня Сфера вызывает смешанные чувства - она абсолютно сломанная (и не то чтобы идеально продуманная даже без этого), но все равно нравится. Даже не помню, когда в последний раз в нее играл по-нормальному
У меня нет нормального ответа, на самом деле. Я сначала написал почти весь существующий код, пока разбирался, как оно работает, а потом уже подумал, где есть бесплатный navmesh)
Вся физика на сервере, т.е. клиенту отдается текущее положение объекта в пространстве, без скорости / приложенных сил и т.д. Дальше клиент как-то интерполирует перемещение из точки А в точку Б.
А вот как это самое положение в пространстве лежит в пакете - это прекрасно:
Его минимум 3 варианта в зависимости от отправителя и действия:
Сервер, перемещение объектов
Сервер, все остальное (спавн игрока и предметов, телепорт игрока и т.д.)
Клиент, пинг
Для перемещения объектов сервер кладет в пакет:
32768 + целую часть значения, если это X или Z
1200 + целую часть значения, если это Y
Дробную часть каждой координаты (точнее, 4095 - значение для X и Z и 1200 - значение для Y) в другом месте, с точностью примерно до 1/64 этой дробной части. Возможно, тут есть какая-то сильно более простая формула, но я ее пока не понял.
Для всего остального на сервере:
Берем целую часть двоичного логарифма координаты, она же Math.Truncate(log2(x)) (если координата в полуинтервале [0; 1), результат всех операций 58)
Берем кол-во шагов, которое нужно пройти, чтобы от 11 (т.е. базовой координаты 2048) дойти до 2ˆMath.Truncate(log2(x))
Если координата больше 2048, то масштаб (или как его назвать еще) = 69 + steps / 2
Если координата меньше или равна 2048, то масштаб = 69 - (steps + 1) / 2
Число, которое мы будем энкодить = (x / 2ˆ(Math.Truncate(log2(x))) + 1) * 2 ^ 23. Дробную часть отбрасываем.
Дальше нам остается только записать эту чиселку и масштаб, не забыв поменять один из бит на 1, если кол-во шагов из пункта 2 нечетное.
На клиенте похожая история, только масштаб там начинается с 126.
Я надеюсь, что есть какой-то адекватный алгоритм, делающий эти преобразования проще, но я не очень умный и его не знаю
Насчет помочь - я всеми руками за, пожалуйста, пишите мне :)
Координаты перемещения я проверял в стартовом данже, он под землей. Вполне вероятно, что на поверхности или в других диапазонах координат формула окажется другой =/
Суммарно координаты заняли у меня где-то с месяц по несколько часов в день, наверно.
Сесть ковыряться в Сфере было тяжело( потом когда оно начало как-то работать стало гораздо веселее
До координат. Чертовы координаты.
Для многих первая, кажется) До Сферы я не знал, что ММО (РПГ) вообще существуют