2016-10-11 6 views
0

私はブラウザゲームを開発しています。プレイフレームワークで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")) 
    }) 
} 

このフィルタは機能しません。サーバーはまだ圧縮されていないデータを送信します。私は間違っているの?

+1

また、トラフィックを減らすためのさまざまな方法が考えられます:jsonを短く送信(フィールド名を減らす)、フル状態の代わりにdiffを送信する、json(protobuf)以外のフォーマットを使用する – vdebergue

+0

JSONをリファクタリングして可能な限り短くしてください。しかし、私の計算によれば、それは〜2kB /秒を節約するでしょう。私はあなたに連絡をとっておきます。 –

答えて

0

gzipフィルタを有効にするためにall settingsを追加しましたか?

私はあなたがこの二点に言及することを見ていない:

1)build.sbtであなたのlibraryDependenciesにプレイフィルタプロジェクトを追加します。

libraryDependencies += filters 

2)Filtersクラスは、どちらかのルートにすることができパッケージ、または別の名前があるか、別のパッケージにある場合はplay.http.filtersapplication.confで設定する必要があります。

play.http.filters = "filters.MyFilters" 

Filterから@Singletonを削除してみてください。この注釈はフィルタのドキュメントにはありません。また、私のプロジェクトでは使用しません。

+0

ライブラリの依存関係は次のようになります。 'libraryDependencies ++ =配列(' ' JDBC、' ' キャッシュ、' ' WS、' ' "org.scalatestplus.play" %% "scalatestplusプレイ" %" 1.5.1 "%Test、' 'filters' ') ' ' Filters'クラスはルートパッケージに含まれています。 '@ Singleton'アノテーションを削除しました。フィルタはまだ動作しません。 –

関連する問題