【发布时间】:2016-10-11 14:27:17
【问题描述】:
我正在开发一款浏览器游戏。
服务器端是在 Play Framework 2.5.x (scala) 上编写的。客户端(JS 应用程序)通过 websocket 与服务器通信。服务器大约每 250 毫秒向客户端发送消息。
问题是每个播放器的流量接近 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
}]
}
}
我阅读了几篇文章并认为我必须压缩发送给客户端的消息。因此,我尝试在 play applicaton 中通过 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而不是full state,使用不同于json的格式(protobuf)
-
我将重构 JSON 以使其尽可能短。但根据我的计算,它可以为我节省大约 2kB/秒。我会与您保持联系。
标签: playframework websocket gzip