私はブラウザゲームを開発しています。プレイフレームワークでwebSocketデータフローを減らす方法2.5.x
サーバー側は、Play Framework 2.5.x(scala)で書かれています。クライアント(JSアプリケーション)はWebSocketを介してサーバーと通信します。サーバーは約250msecごとにクライアントのメッセージに送信します。
問題は、トラフィックが1プレーヤーあたり16kB /秒に近く、私はそれを可能な限り減らすことです。
すべてのメッセージは、(実際の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をリファクタリングして可能な限り短くしてください。しかし、私の計算によれば、それは〜2kB /秒を節約するでしょう。私はあなたに連絡をとっておきます。 –