Я разрабатываю браузерную игру.Как уменьшить поток данных webSocket в игровой инфраструктуре 2.5.x
Серверная сторона написана на Play Framework 2.5.x (scala). Клиент (приложение JS) общается с сервером через websocket. Сервер отправляет сообщения клиента каждые 250 мсек.
Проблема в том, что трафик составляет около 16 кБ/с на одного игрока, и я хотел бы уменьшить его настолько, насколько это возможно.
Каждое сообщение сериализованная состояние игры вокруг игрока, который выглядит следующим образом (фактическая JSON больше, это только показывает идею):
{
"gameState": {
"player": {
"id": 218,
"body": [[42, 20],[42, 21],[43, 21],[43, 20]],
"name": "player",
"color": 1,
"isBot": false
},
"food": [[25, 25],[24, 25],[24, 24],[24, 23],[23, 23]],
"enemies": [{
"id": 217,
"body": [[53, 46],[53, 47],[53, 48],[53, 49]],
"name": "roBot#217",
"color": 22,
"isBot": true
}]
}
}
Я прочитал пару статей и думаю, что у меня есть для сжатия сообщений, отправленных клиенту. Итак, я попытался отфильтровать все ответы gzip в игре:
@Singleton
class Filters @Inject() (gzipFilter: GzipFilter, implicit val materializer: Materializer)
extends DefaultHttpFilters(gzipFilter) {
new GzipFilter(shouldGzip = (request, response) => {
response.header.headers.get("Content-Type").exists(_.startsWith("application/json"))
})
}
Но этот фильтр не работает. Сервер по-прежнему отправляет не сжатые данные. Что я делаю неправильно?
Вы также можете подумать о различных стратегиях, чтобы уменьшить трафик: отправить короткое json (уменьшить имя поля), отправить diff вместо полного состояния, использовать другой формат, чем json (protobuf) – vdebergue
Я собираюсь реорганизовать JSON, чтобы сделать это как можно короче. Но, по моим расчетам, это спасло бы меня ~ 2 кБ/сек. Я свяжусь с вами. –