Сказка навсегда остановлена.

Мы безмерно благодарны каждому из вас за время, которое вы подарили нашей игре, истории, которые вы создали, поддержку, которую оказывали друг другу и нам.

Надеемся, Сказка останется светлым и добрым воспоминанием в вашей жизни, и вы будете вспоминать наши приключения с улыбкой.

Это были замечательные тринадцать лет. Спасибо вам за них.

С любовью, команда Сказки.

mayorovp
без гильдии
могущество: 95

эльфийка Shebang
47 уровня
Что можно изменить частично:

data.account.hero.pvp можно вынести в отдельный метод. Я думаю, pvp интересует не очень большую часть игроков (кстати, можно же собрать статистику?). Альтернативный вариант - не добавлять информацию о pvp если герой не участвует в pvp.
data.account.hero.bag, data.account.hero.euqipment - можно оставить только переменные, а словарную информацию запрашивать отдельным методом (и кешировать на клиенте).
data.account.hero.diary, data.account.hero.messages - просто напрашивается вывод информации начиная с указанного в параметре момента времени
data.account.hero.quests - тут красивого решения предложить не могу. Но тоже очень больший кусок...

По поводу частичного получения информации. Если все делать параметрами, получится очень много. Почему бы не сделать язык запросов?

Так, запрос { "data": { "account": { "hero": { "energy": "?", "diary": { "?later": 1422696170.749529 } } } } } мог бы означать, что в ответе должны присутствовать разделы data.account.hero.energy и data.account.hero.diary, причем в дневнике нас интересуют только записи после 1422696170.749529.



Сообщение изменено
Hamster
без гильдии
могущество: 5163
длань судьбы
гоблин Джеаки
102 уровня
Tiendil
Варианты:
1. рринимать параметром запроса список исключаемой информации (например, список квестов, список карт);
2. возвращать только изменение информации с момента предыдущего ответа;
3. отдельный «уменьшенный ответ» с самой важной информацией + маркер того, что изменился «большой» ответ;
4. ещё что-то.
CrazyNiger
Нет, второй вариант - вобще не вариант. Как же REST и все такое =)
Можно первый вариант, но наоборот. Добавлять параметр - какую информацию хочет получить клиент, если параметра нет, то всю.
Согласен: можно либо разбить /game/api/info на несколько запросов - основная информация, квесты, рюкзак и т. п., либо добавить параметр к этому запросу с желаемыми блоками информации. При отсутствии параметра возвращать всю информацию. "Уменьшенный ответ" можно сделать тем же запросом с особым параметром - например, та же "основная информация".

mayorovp
data.account.hero.bag, data.account.hero.euqipment - можно оставить только переменные, а словарную информацию запрашивать отдельным методом (и кешировать на клиенте).
Что имеется ввиду под "переменными" и под "словарной информацией"?

data.account.hero.diary, data.account.hero.messages - просто напрашивается вывод информации начиная с указанного в параметре момента времени
Так, как сейчас, мне кажется, вполне нормально, не нужно городить к этому дополнительные параметры.

data.account.hero.quests - тут красивого решения предложить не могу. Но тоже очень больший кусок...
Опять же, сам по себе этот параметр в ответе не такой уж и большой, если он будет отдельно.

По поводу частичного получения информации. Если все делать параметрами, получится очень много. Почему бы не сделать язык запросов?
Так, запрос { "data": { "account": { "hero": { "energy": "?", "diary": { "?later": 1422696170.749529 } } } } } мог бы означать, что в ответе должны присутствовать разделы data.account.hero.energy и data.account.hero.diary, причем в дневнике нас интересуют только записи после 1422696170.749529.
Ненужное усложнение, имхо. Параметра со списком желаемых блоков будет достаточно.
mayorovp
без гильдии
могущество: 95

эльфийка Shebang
47 уровня
Hamster
Что имеется ввиду под "переменными" и под "словарной информацией"?
К примеру, название предмета однозначно определяется исходя из его номера - нет необходимости передавать его в каждом ответе.
Hamster
без гильдии
могущество: 5163
длань судьбы
гоблин Джеаки
102 уровня
mayorovp
К примеру, название предмета однозначно определяется исходя из его номера - нет необходимости передавать его в каждом ответе.
Мне кажется, на таких уж спичках экономить не надо)
mayorovp
без гильдии
могущество: 95

эльфийка Shebang
47 уровня
Почему это вдруг спички? Перечисленные мною "спички" в сумме половину трафика составляют.
Hamster
без гильдии
могущество: 5163
длань судьбы
гоблин Джеаки
102 уровня
Потому что я говорил о названиях предметов, а не обо всех твоих пунктах.
mayorovp
без гильдии
могущество: 95

эльфийка Shebang
47 уровня
Названия предметов тоже прилично места отнимают.
Silent Wrangler
[​ϟ] Командор
могущество: 17420
длань судьбы
гоблин
Наивеличайший Выдумщик Генджис
131 уровня
Кстати да, где-то килобайт будет с названий. Можно оставить это на стороне клиента - одни эти "спички" неплохо сэкономят. С другой стороны, разработчикам каждый раз придется вручную обновлять базы названий при обновлении Сказки, что не есть гуд.
mayorovp
без гильдии
могущество: 95

эльфийка Shebang
47 уровня
Зачем вручную? Говорю же, запрашивать справочные данные отдельным методом и кешировать их на клиенте.
Hamster
без гильдии
могущество: 5163
длань судьбы
гоблин Джеаки
102 уровня
А почему тогда не поменять ключи с data.account.hero.euqipment на, например, d.a.h.e ? Тоже много сэкономится.
mayorovp
без гильдии
могущество: 95

эльфийка Shebang
47 уровня
Это резко снизит читаемость ответа. А если плевать на читаемость - то надо переходить на бинарный протокол сразу, без промежуточного json с однобуквенными ключами.
Hamster
без гильдии
могущество: 5163
длань судьбы
гоблин Джеаки
102 уровня
mayorovp
Это резко снизит читаемость ответа. А если плевать на читаемость - то надо переходить на бинарный протокол сразу, без промежуточного json с однобуквенными ключами.
Так читать-то его никому и не надо.
Ну да, можно и на бинарный. И гзипом его.

В общем, мое мнение таково: сначала нужно сделать минимум изменений - то есть, разбить большой запрос на много маленьких (либо, что по сути то же самое, добавить параметры, какие блоки нужны), внутренности можно и не переделывать так кардинально. А уже потом можно думать о кардинальных изменениях, если таковые потребуются - хоть бинарный формат. Но, мне кажется, это уже не будет необходимо.
Silent Wrangler
[​ϟ] Командор
могущество: 17420
длань судьбы
гоблин
Наивеличайший Выдумщик Генджис
131 уровня
Зачем вручную? Говорю же, запрашивать справочные данные отдельным методом и кешировать их на клиенте.
Тогда это означает кнопку в клиенте "когда Сказка обновится, нажми сюда". Ибо запрашивать их периодически - еще больше увеличивать потребление трафика, а давать знать клиенту, что именно сейчас следует обновить базы, кроме какого-либо exception handling'а, когда нарываешься на незнакомый объект, я не знаю.
mayorovp
без гильдии
могущество: 95

эльфийка Shebang
47 уровня
Silent Wrangler
Требуемый номер версии справочников можно в том же /api/info или /game/api/info передавать. Одно число - не 20 строк.
Silent Wrangler
[​ϟ] Командор
могущество: 17420
длань судьбы
гоблин
Наивеличайший Выдумщик Генджис
131 уровня
Логично.
Кстати, тогда так можно и с городами и именами советников. Если отставание клиента не больше N версий, то передается только дельта за N (список изменений на стороне сервера) версий, если больше - весь справочник.
Версию своего справочника посылает клиент, на сервере сличают с актуальной. Плюс пара миллисекунд на запрос погоды не сделает.



Сообщение изменено