2016-10-11 2 views
0

Я разрабатываю браузерную игру.Как уменьшить поток данных 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")) 
    }) 
} 

Но этот фильтр не работает. Сервер по-прежнему отправляет не сжатые данные. Что я делаю неправильно?

+1

Вы также можете подумать о различных стратегиях, чтобы уменьшить трафик: отправить короткое json (уменьшить имя поля), отправить diff вместо полного состояния, использовать другой формат, чем json (protobuf) – vdebergue

+0

Я собираюсь реорганизовать JSON, чтобы сделать это как можно короче. Но, по моим расчетам, это спасло бы меня ~ 2 кБ/сек. Я свяжусь с вами. –

ответ

0

Вы добавили all settings для включения фильтра gzip?

Я не вижу, что вы упоминаете эти два момента:

1) Добавить проект Play фильтры к libraryDependencies в build.sbt:

libraryDependencies += filters 

2) Filters класс может быть либо в корне пакет, или если он имеет другое имя или находится в другом пакете, необходимо настроить с помощью play.http.filters в application.conf:

play.http.filters = "filters.MyFilters" 

И попробуйте удалить @Singleton из Filter - эта аннотация отсутствует в документации к фильму, и я не использую ее также в моих проектах.

+0

Зависимости библиотек выглядеть следующим образом: 'libraryDependencies ++ = Seq (' ' JDBC,' ' кэш,' ' , Ws,' ' "org.scalatestplus.play" %% "scalatestplus-игра" %" 1.5.1 "% Test,' 'filters' ') ' Класс« Фильтры »находится в корневом пакете. Я удалил аннотацию '@ Singleton'. Фильтр по-прежнему не работает. –

Смежные вопросы